diff --git a/CMakeLists.txt b/CMakeLists.txt index 43eff7a1e..be871596c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -264,7 +264,8 @@ if(ENABLE_CUDA) Simulator/Vertices/Neuro/AllLIFNeurons_d.cpp Simulator/Vertices/Neuro/AllIZHNeurons_d.cpp Simulator/Vertices/Neuro/AllIFNeurons_d.cpp - Simulator/Vertices/Neuro/AllSpikingNeurons_d.cpp) + Simulator/Vertices/Neuro/AllSpikingNeurons_d.cpp + Simulator/Vertices/NG911/All911Vertices_d.cpp) set_source_files_properties(${cuda_VerticesSources} PROPERTIES LANGUAGE CUDA) endif() @@ -296,6 +297,7 @@ else() list(REMOVE_ITEM Vertices_Source "${CMAKE_CURRENT_SOURCE_DIR}/Simulator/Vertices/Neuro/AllIZHNeurons_d.cpp") list(REMOVE_ITEM Vertices_Source "${CMAKE_CURRENT_SOURCE_DIR}/Simulator/Vertices/Neuro/AllIFNeurons_d.cpp") list(REMOVE_ITEM Vertices_Source "${CMAKE_CURRENT_SOURCE_DIR}/Simulator/Vertices/Neuro/AllSpikingNeurons_d.cpp") + list(REMOVE_ITEM Vertices_Source "${CMAKE_CURRENT_SOURCE_DIR}/Simulator/Vertices/NG911/All911Vertices_d.cpp") add_library(Vertices STATIC ${Vertices_Source}) diff --git a/Simulator/Connections/NG911/Connections911.cpp b/Simulator/Connections/NG911/Connections911.cpp index a478d4b1e..a32162969 100644 --- a/Simulator/Connections/NG911/Connections911.cpp +++ b/Simulator/Connections/NG911/Connections911.cpp @@ -96,52 +96,6 @@ bool Connections911::updateConnections() } -/// Finds the outgoing edge from the given vertex to the Responder closest to -/// the emergency call location -BGSIZE Connections911::getEdgeToClosestResponder(const Call &call, BGSIZE vertexIdx) -{ - All911Edges &edges911 = dynamic_cast(*edges_); - - vertexType requiredType; - if (call.type == "Law") - requiredType = vertexType::LAW; - else if (call.type == "EMS") - requiredType = vertexType::EMS; - else if (call.type == "Fire") - requiredType = vertexType::FIRE; - - // loop over the outgoing edges looking for the responder with the shortest - // Euclidean distance to the call's location. - BGSIZE startOutEdg = synapseIndexMap_->outgoingEdgeBegin_[vertexIdx]; - BGSIZE outEdgCount = synapseIndexMap_->outgoingEdgeCount_[vertexIdx]; - Layout911 &layout911 - = dynamic_cast(Simulator::getInstance().getModel().getLayout()); - - BGSIZE resp, respEdge; - double minDistance = numeric_limits::max(); - for (BGSIZE eIdxMap = startOutEdg; eIdxMap < startOutEdg + outEdgCount; ++eIdxMap) { - BGSIZE outEdg = synapseIndexMap_->outgoingEdgeIndexMap_[eIdxMap]; - assert(edges911.inUse_[outEdg]); // Edge must be in use - - BGSIZE dstVertex = edges911.destVertexIndex_[outEdg]; - if (layout911.vertexTypeMap_[dstVertex] == requiredType) { - double distance = layout911.getDistance(dstVertex, call.x, call.y); - - if (distance < minDistance) { - minDistance = distance; - resp = dstVertex; - respEdge = outEdg; - } - } - } - - // We must have found the closest responder of the right type - assert(minDistance < numeric_limits::max()); - assert(layout911.vertexTypeMap_[resp] == requiredType); - return respEdge; -} - - /// Randomly delete 1 PSAP and rewire all the edges around it. bool Connections911::erasePSAP(AllVertices &vertices, Layout &layout) { diff --git a/Simulator/Connections/NG911/Connections911.h b/Simulator/Connections/NG911/Connections911.h index cfb4be2dd..16b8c4947 100644 --- a/Simulator/Connections/NG911/Connections911.h +++ b/Simulator/Connections/NG911/Connections911.h @@ -79,14 +79,6 @@ class Connections911 : public Connections { /// @return true if successful, false otherwise. virtual bool updateConnections() override; - /// Finds the outgoing edge from the given vertex to the Responder closest to - /// the emergency call location - /// - /// @param call The call that needs a Responder - /// @param vertexIdx The index of the vertex serving the call (A PSAP) - /// @return The index of the outgoing edge to the closest Responder - BGSIZE getEdgeToClosestResponder(const Call &call, BGSIZE vertexIdx); - /// Returns the complete list of all deleted or added edges as a string. /// @return xml representation of all deleted or added edges string changedEdgesToXML(bool added); diff --git a/Simulator/Core/FunctionNodes/GenericFunctionNode.h b/Simulator/Core/FunctionNodes/GenericFunctionNode.h index 7f149890b..ab0c79c42 100644 --- a/Simulator/Core/FunctionNodes/GenericFunctionNode.h +++ b/Simulator/Core/FunctionNodes/GenericFunctionNode.h @@ -23,7 +23,13 @@ class GenericFunctionNode : public IFunctionNode { ~GenericFunctionNode() = default; /// Invokes the stored function if the sent operation type matches the operation type the function is stored as. - bool invokeFunction(const Operations &operation) const override; + virtual bool invokeFunction(const Operations &operation) const override; + + /// TODO: Remove when IFunctionNode supports functions with non-empty signatures + virtual bool invokeFunction(const Operations &operation, uint64_t arg1, uint64_t arg2) const + { + return false; + } private: std::function function_; ///< Stored function. diff --git a/Simulator/Core/FunctionNodes/IFunctionNode.h b/Simulator/Core/FunctionNodes/IFunctionNode.h index dca3629aa..ff9f887f2 100644 --- a/Simulator/Core/FunctionNodes/IFunctionNode.h +++ b/Simulator/Core/FunctionNodes/IFunctionNode.h @@ -10,6 +10,7 @@ #pragma once #include "Operations.h" +#include ///for uint64_t using namespace std; @@ -18,9 +19,14 @@ class IFunctionNode { /// Destructor. virtual ~IFunctionNode() = default; + /// TODO: Need to refactor to allow for passing in arguments. Otherwise, FunctionNode classes can not support + /// non-empty signatures. /// Invokes the stored function if the sent operation type matches the operation type the function is stored as. virtual bool invokeFunction(const Operations &operation) const = 0; + /// Invokes the stored function using the two arguments as input + virtual bool invokeFunction(const Operations &operation, uint64_t arg1, uint64_t arg2) const = 0; + protected: /// The operation type of the stored function. Operations operationType_; diff --git a/Simulator/Core/FunctionNodes/TwoUint64ArgFunctionNode.cpp b/Simulator/Core/FunctionNodes/TwoUint64ArgFunctionNode.cpp new file mode 100644 index 000000000..d851295f0 --- /dev/null +++ b/Simulator/Core/FunctionNodes/TwoUint64ArgFunctionNode.cpp @@ -0,0 +1,33 @@ +/** + * @file TwoUint64ArgFunctionNode.cpp + * + * @ingroup Simulator/Core/FunctionNodes + * + * @brief Stores a function with two uint64_t args to invoke. Used by operation manager to store functions to defined by an operation type. + * + * Function Signature supported : void (uint64_t,uint64_t) + * + */ + +#include "TwoUint64ArgFunctionNode.h" +#include "Operations.h" +#include + +/// Constructor, Function Signature: void (uint64_t, uint64_t) +TwoUint64ArgFunctionNode::TwoUint64ArgFunctionNode( + const Operations &operation, const std::function &func) +{ + operationType_ = operation; + function_ = func; +} + +/// Invokes the stored function if the sent operation type matches the operation type the function is stored as. +bool TwoUint64ArgFunctionNode::invokeFunction(const Operations &operation, uint64_t arg1, + uint64_t arg2) const +{ + if (operation == operationType_) { + __invoke(function_, arg1, arg2); + return true; + } + return false; +} \ No newline at end of file diff --git a/Simulator/Core/FunctionNodes/TwoUint64ArgFunctionNode.h b/Simulator/Core/FunctionNodes/TwoUint64ArgFunctionNode.h new file mode 100644 index 000000000..d1ff8336f --- /dev/null +++ b/Simulator/Core/FunctionNodes/TwoUint64ArgFunctionNode.h @@ -0,0 +1,38 @@ +/** + * @file TwoUint64ArgFunctionNode.h + * + * @ingroup Simulator/Core/FunctionNodes + * + * @brief Stores a function with two uint64_t args to invoke. Used by operation manager to store functions to defined by an operation type. + * + */ + +#pragma once + +#include "IFunctionNode.h" +#include + +using namespace std; + +class TwoUint64ArgFunctionNode : public IFunctionNode { +public: + /// Constructor, Function Signature: void () + TwoUint64ArgFunctionNode(const Operations &operationType, + const std::function &function); + + /// Destructor + ~TwoUint64ArgFunctionNode() = default; + + /// TODO: Remove when IFunctionNode supports functions with non-empty signatures + virtual bool invokeFunction(const Operations &operation) const + { + return false; + } + + /// Invokes the stored function if the sent operation type matches the operation type the function is stored as. + virtual bool invokeFunction(const Operations &operation, uint64_t arg1, + uint64_t arg2) const override; + +private: + std::function function_; ///< Stored function. +}; diff --git a/Simulator/Core/GPUModel.cpp b/Simulator/Core/GPUModel.cpp index d78fdbc24..364ba0a9c 100644 --- a/Simulator/Core/GPUModel.cpp +++ b/Simulator/Core/GPUModel.cpp @@ -12,6 +12,7 @@ #include "AllVertices.h" #include "Connections.h" #include "Global.h" +#include "MersenneTwister_d.h" #include "OperationManager.h" #ifdef VALIDATION_MODE @@ -52,12 +53,15 @@ GPUModel::GPUModel() : void GPUModel::allocDeviceStruct() { // Allocate memory for random noise array - int numVertices = Simulator::getInstance().getTotalVertices(); - BGSIZE randNoise_d_size = numVertices * sizeof(float); // size of random noise array + int numVerticesNeedingNoise = layout_->getVertices().getNumberOfVerticesNeedingDeviceNoise(); + int numberOfNoiseElements = roundUpNumberOfNoiseElements(numVerticesNeedingNoise); + LOG4CPLUS_DEBUG(fileLogger_, + "Number of elements allocated for noise: " << numberOfNoiseElements); + BGSIZE randNoise_d_size = numberOfNoiseElements * sizeof(float); // size of random noise array HANDLE_ERROR(cudaMalloc((void **)&randNoise_d, randNoise_d_size)); // Allocate synapse inverse map in device memory - allocEdgeIndexMap(numVertices); + allocEdgeIndexMap(Simulator::getInstance().getTotalVertices()); } /// Copies device memories to host memories and deallocates them. @@ -91,9 +95,20 @@ void GPUModel::setupSim() int rng_blocks = 25; //# of blocks the kernel will use int rng_nPerRng = 4; //# of iterations per thread (thread granularity, # of rands generated per thread) - int rng_mt_rng_count = Simulator::getInstance().getTotalVertices() - / rng_nPerRng; //# of threads to generate for numVertices rand #s + int numVerticesNeedingNoise = layout_->getVertices().getNumberOfVerticesNeedingDeviceNoise(); + int numberOfNoiseElements = roundUpNumberOfNoiseElements(numVerticesNeedingNoise); + int rng_mt_rng_count + = numberOfNoiseElements / rng_nPerRng; //# of threads to generate for numVertices rand #s + assert(rng_mt_rng_count <= MT_RNG_COUNT); int rng_threads = rng_mt_rng_count / rng_blocks; //# threads per block needed + LOG4CPLUS_DEBUG(fileLogger_, "initMTGPU state: " << endl + << "Noise seed: " + << Simulator::getInstance().getNoiseRngSeed() + << endl + << "RNG_blocks: " << rng_blocks << endl + << "RNG_threads: " << rng_threads << endl + << "RNG_nPerRng: " << rng_nPerRng << endl + << "Count: " << rng_mt_rng_count); initMTGPU(Simulator::getInstance().getNoiseRngSeed(), rng_blocks, rng_threads, rng_nPerRng, rng_mt_rng_count); @@ -165,7 +180,6 @@ void GPUModel::advance() cudaLapTime(t_gpu_rndGeneration); cudaStartTimer(); #endif // PERFORMANCE_METRICS - // display running info to console // Advance vertices -------------> vertices.advanceVertices(edges, allVerticesDevice_, allEdgesDevice_, randNoise_d, @@ -217,7 +231,6 @@ void GPUModel::advance() cudaLapTime(t_gpu_advanceSynapses); cudaStartTimer(); #endif // PERFORMANCE_METRICS - // integrate the inputs of the vertices vertices.integrateVertexInputs(allVerticesDevice_, edgeIndexMapDevice_, allEdgesDevice_); @@ -342,4 +355,16 @@ AllVerticesDeviceProperties *&GPUModel::getAllVerticesDevice() AllEdgesDeviceProperties *&GPUModel::getAllEdgesDevice() { return allEdgesDevice_; +} + +int GPUModel::roundUpNumberOfNoiseElements(int input) +{ + // MersenneTwister requires the number of elements to be 100 or more and a multiple of 100 + // To deal with this, we take the input and round it up to the nearest multiple of 100. + assert(input > 0); + // Already a multiple of 100 so return + if (input % 100 == 0) + return input; + // Return the next highest multiple of 100 + return ((input + 99) / 100) * 100; } \ No newline at end of file diff --git a/Simulator/Core/GPUModel.h b/Simulator/Core/GPUModel.h index 0a9562e40..01fdcace3 100644 --- a/Simulator/Core/GPUModel.h +++ b/Simulator/Core/GPUModel.h @@ -112,6 +112,10 @@ class GPUModel : public Model { /// Deallocates device memories. virtual void deleteDeviceStruct(); + /// Takes the input and returns a rounded up number of elements to + /// use for generating device noise. + int roundUpNumberOfNoiseElements(int input); + /// Pointer to device random noise array. float *randNoise_d; diff --git a/Simulator/Core/OperationManager.cpp b/Simulator/Core/OperationManager.cpp index 7cd1222b4..87a14afa7 100644 --- a/Simulator/Core/OperationManager.cpp +++ b/Simulator/Core/OperationManager.cpp @@ -13,6 +13,7 @@ #include "OperationManager.h" #include "GenericFunctionNode.h" +#include "TwoUint64ArgFunctionNode.h" #include #include #include @@ -40,6 +41,22 @@ void OperationManager::registerOperation(const Operations &operation, } } +/// @brief Handles function signature: void (uint64_t,uint64_t). +/// @param operation The Operation type that will use the input function. +/// @param function The function invoked for the operation. Takes in two arguments of type uint64_t +void OperationManager::registerOperation(const Operations &operation, + const function &function) +{ + try { + functionList_.push_back( + unique_ptr(new TwoUint64ArgFunctionNode(operation, function))); + } catch (exception e) { + LOG4CPLUS_FATAL(logger_, string(e.what()) + + ". Push back failed in OperationManager::registerOperation"); + throw runtime_error(string(e.what()) + " in OperationManager::registerOperation"); + } +} + /// Takes in a operation type and invokes all registered functions that are classified as that operation type. void OperationManager::executeOperation(const Operations &operation) const { @@ -47,6 +64,21 @@ void OperationManager::executeOperation(const Operations &operation) const if (functionList_.size() > 0) { for (auto i = functionList_.begin(); i != functionList_.end(); ++i) { (*i)->invokeFunction(operation); + //TODO: Throw fatal if false + } + } +} + +/// Take in a operation type and invokes all registered functions that are classified as that operation type using the input arguments. +void OperationManager::executeOperation(const Operations &operation, uint64_t arg1, + uint64_t arg2) const +{ + LOG4CPLUS_INFO(logger_, "Executing operation " + operationToString(operation)); + /// TODO: Should we check anything about arg1 and arg2 before passing to the invoke??? + if (functionList_.size() > 0) { + for (auto i = functionList_.begin(); i != functionList_.end(); ++i) { + (*i)->invokeFunction(operation, arg1, arg2); + //TODO: Throw fatal if false } } } @@ -73,6 +105,8 @@ string OperationManager::operationToString(const Operations &operation) const return "copyFromGPU"; case Operations::allocateGPU: return "allocateGPU"; + case Operations::loadEpochInputs: + return "loadEpochInputs"; default: return "Operation isn't in OperationManager::operationToString()"; } diff --git a/Simulator/Core/OperationManager.h b/Simulator/Core/OperationManager.h index e85b00993..94c9eae98 100644 --- a/Simulator/Core/OperationManager.h +++ b/Simulator/Core/OperationManager.h @@ -35,9 +35,16 @@ class OperationManager { /// Handles function signature: void () void registerOperation(const Operations &operation, const function &function); + /// Handles function signature: void (uint64_t,uint64_t) + void registerOperation(const Operations &operation, + const function &function); + /// Takes in a operation type and invokes all registered functions that are classified as that operation type. void executeOperation(const Operations &operation) const; + /// Take in a operation type and invokes all registered functions that are classified as that operation type using the input arguments. + void executeOperation(const Operations &operation, uint64_t arg1, uint64_t arg2) const; + /// Takes in the operation enum and returns the enum as a string. Used for debugging purposes. string operationToString(const Operations &operation) const; diff --git a/Simulator/Core/Operations.h b/Simulator/Core/Operations.h index 27b5c4ff2..112cfaba3 100644 --- a/Simulator/Core/Operations.h +++ b/Simulator/Core/Operations.h @@ -22,5 +22,6 @@ enum class Operations { copyToGPU, copyFromGPU, allocateGPU, - registerHistoryVariables + registerHistoryVariables, + loadEpochInputs }; \ No newline at end of file diff --git a/Simulator/Core/Simulator.cpp b/Simulator/Core/Simulator.cpp index e4a42d9df..5cd575612 100644 --- a/Simulator/Core/Simulator.cpp +++ b/Simulator/Core/Simulator.cpp @@ -188,7 +188,8 @@ void Simulator::advanceEpoch(int currentEpoch) const uint64_t count = 0; // Compute step number at end of this simulation epoch uint64_t endStep = g_simulationStep + static_cast(epochDuration_ / deltaT_); - model_->getLayout().getVertices().loadEpochInputs(g_simulationStep, endStep); + OperationManager::getInstance().executeOperation(Operations::loadEpochInputs, g_simulationStep, + endStep); // DEBUG_MID(model->logSimStep();) // Generic model debug call uint64_t onePercent = (epochDuration_ / deltaT_) * numEpochs_ * 0.01; while (g_simulationStep < endStep) { diff --git a/Simulator/Edges/NG911/All911Edges.h b/Simulator/Edges/NG911/All911Edges.h index 56f135a33..31ed01453 100644 --- a/Simulator/Edges/NG911/All911Edges.h +++ b/Simulator/Edges/NG911/All911Edges.h @@ -70,7 +70,8 @@ class All911Edges : public AllEdges { int maxEdgesPerVertex) override; virtual void deleteEdgeDeviceStruct() override; virtual void copyEdgeHostToDevice() override; - virtual void copyEdgeHostToDevice(void *allEdgesDevice, int numVertices, int maxEdgesPerVertex) override; + virtual void copyEdgeHostToDevice(void *allEdgesDevice, int numVertices, + int maxEdgesPerVertex) override; virtual void copyEdgeDeviceToHost() override; virtual void copyDeviceEdgeCountsToHost(void *allEdgesDevice) override; virtual void advanceEdges(void *allEdgesDevice, void *allVerticesDevice, diff --git a/Simulator/Edges/NG911/All911Edges_d.cpp b/Simulator/Edges/NG911/All911Edges_d.cpp index 6e4898523..757c91556 100644 --- a/Simulator/Edges/NG911/All911Edges_d.cpp +++ b/Simulator/Edges/NG911/All911Edges_d.cpp @@ -33,6 +33,10 @@ void All911Edges::allocEdgeDeviceStruct() void All911Edges::allocEdgeDeviceStruct(void **allEdgesDevice, int numVertices, int maxEdgesPerVertex) { + LOG4CPLUS_DEBUG(edgeLogger_, + "Size of 911 edges device: " << sizeof(All911EdgesDeviceProperties)); + LOG4CPLUS_DEBUG(edgeLogger_, "maxTotalEdges: " << maxEdgesPerVertex * numVertices); + LOG4CPLUS_DEBUG(edgeLogger_, "Size of edgetype: " << sizeof(edgeType)); All911EdgesDeviceProperties allEdges; allocDeviceStruct(allEdges, numVertices, maxEdgesPerVertex); HANDLE_ERROR(cudaMalloc(allEdgesDevice, sizeof(All911EdgesDeviceProperties))); @@ -150,6 +154,7 @@ void All911Edges::copyHostToDevice(void *allEdgesDevice, All911EdgesDeviceProperties &allEdgesDeviceProps, int numVertices, int maxEdgesPerVertex) { + LOG4CPLUS_DEBUG(edgeLogger_, "Copying 911Edges to device"); BGSIZE maxTotalEdges = maxEdgesPerVertex * numVertices; HANDLE_ERROR(cudaMemcpy(allEdgesDeviceProps.sourceVertexIndex_, sourceVertexIndex_.data(), maxTotalEdges * sizeof(int), cudaMemcpyHostToDevice)); @@ -171,98 +176,82 @@ void All911Edges::copyHostToDevice(void *allEdgesDevice, HANDLE_ERROR(cudaMemcpy(allEdgesDeviceProps.isRedial_, isRedial_.data(), maxTotalEdges * sizeof(unsigned char), cudaMemcpyHostToDevice)); - // Bracket array declaration to memcpy to manually release array from stack - // This is necessary to prevent segmentation faults when running large graphs - { - int cpuVertexId[maxTotalEdges]; - for (int i = 0; i < maxTotalEdges; i++) { - cpuVertexId[i] = call_[i].vertexId; - } - HANDLE_ERROR(cudaMemcpy(allEdgesDeviceProps.vertexId_, cpuVertexId, - maxTotalEdges * sizeof(int), cudaMemcpyHostToDevice)); + // Use heap memory by using a dynamic array to prevent stack overflow/segmentation faults + int *cpuVertexId = new int[maxTotalEdges]; + for (int i = 0; i < maxTotalEdges; i++) { + cpuVertexId[i] = call_[i].vertexId; } + HANDLE_ERROR(cudaMemcpy(allEdgesDeviceProps.vertexId_, cpuVertexId, maxTotalEdges * sizeof(int), + cudaMemcpyHostToDevice)); + delete[] cpuVertexId; - // Bracket array declaration to memcpy to manually release array from stack - // This is necessary to prevent segmentation faults when running large graphs - { - uint64_t cpuTime[maxTotalEdges]; - for (int i = 0; i < maxTotalEdges; i++) { - cpuTime[i] = call_[i].time; - } - HANDLE_ERROR(cudaMemcpy(allEdgesDeviceProps.time_, cpuTime, maxTotalEdges * sizeof(uint64_t), - cudaMemcpyHostToDevice)); + // Use heap memory by using a dynamic array to prevent stack overflow/segmentation faults + uint64_t *cpuTime = new uint64_t[maxTotalEdges]; + for (int i = 0; i < maxTotalEdges; i++) { + cpuTime[i] = call_[i].time; } + HANDLE_ERROR(cudaMemcpy(allEdgesDeviceProps.time_, cpuTime, maxTotalEdges * sizeof(uint64_t), + cudaMemcpyHostToDevice)); + delete[] cpuTime; - // Bracket array declaration to memcpy to manually release array from stack - // This is necessary to prevent segmentation faults when running large graphs - { - int cpuDuration[maxTotalEdges]; - for (int i = 0; i < maxTotalEdges; i++) { - cpuDuration[i] = call_[i].duration; - } - HANDLE_ERROR(cudaMemcpy(allEdgesDeviceProps.duration_, cpuDuration, - maxTotalEdges * sizeof(int), cudaMemcpyHostToDevice)); + // Use heap memory by using a dynamic array to prevent stack overflow/segmentation faults + int *cpuDuration = new int[maxTotalEdges]; + for (int i = 0; i < maxTotalEdges; i++) { + cpuDuration[i] = call_[i].duration; } + HANDLE_ERROR(cudaMemcpy(allEdgesDeviceProps.duration_, cpuDuration, maxTotalEdges * sizeof(int), + cudaMemcpyHostToDevice)); + delete[] cpuDuration; - // Bracket array declaration to memcpy to manually release array from stack - // This is necessary to prevent segmentation faults when running large graphs - { - BGFLOAT cpuX[maxTotalEdges]; - for (int i = 0; i < maxTotalEdges; i++) { - cpuX[i] = call_[i].x; - } - HANDLE_ERROR(cudaMemcpy(allEdgesDeviceProps.x_, cpuX, maxTotalEdges * sizeof(BGFLOAT), - cudaMemcpyHostToDevice)); + // Use heap memory by using a dynamic array to prevent stack overflow/segmentation faults + BGFLOAT *cpuX = new BGFLOAT[maxTotalEdges]; + for (int i = 0; i < maxTotalEdges; i++) { + cpuX[i] = call_[i].x; } + HANDLE_ERROR(cudaMemcpy(allEdgesDeviceProps.x_, cpuX, maxTotalEdges * sizeof(BGFLOAT), + cudaMemcpyHostToDevice)); + delete[] cpuX; - // Bracket array declaration to memcpy to manually release array from stack - // This is necessary to prevent segmentation faults when running large graphs - { - BGFLOAT cpuY[maxTotalEdges]; - for (int i = 0; i < maxTotalEdges; i++) { - cpuY[i] = call_[i].y; - } - HANDLE_ERROR(cudaMemcpy(allEdgesDeviceProps.y_, cpuY, maxTotalEdges * sizeof(BGFLOAT), - cudaMemcpyHostToDevice)); + // Use heap memory by using a dynamic array to prevent stack overflow/segmentation faults + BGFLOAT *cpuY = new BGFLOAT[maxTotalEdges]; + for (int i = 0; i < maxTotalEdges; i++) { + cpuY[i] = call_[i].y; } + HANDLE_ERROR(cudaMemcpy(allEdgesDeviceProps.y_, cpuY, maxTotalEdges * sizeof(BGFLOAT), + cudaMemcpyHostToDevice)); + delete[] cpuY; - // Bracket array declaration to memcpy to manually release array from stack - // This is necessary to prevent segmentation faults when running large graphs - { - int cpuPatience[maxTotalEdges]; - for (int i = 0; i < maxTotalEdges; i++) { - cpuPatience[i] = call_[i].patience; - } - HANDLE_ERROR(cudaMemcpy(allEdgesDeviceProps.patience_, cpuPatience, - maxTotalEdges * sizeof(int), cudaMemcpyHostToDevice)); + // Use heap memory by using a dynamic array to prevent stack overflow/segmentation faults + int *cpuPatience = new int[maxTotalEdges]; + for (int i = 0; i < maxTotalEdges; i++) { + cpuPatience[i] = call_[i].patience; } + HANDLE_ERROR(cudaMemcpy(allEdgesDeviceProps.patience_, cpuPatience, maxTotalEdges * sizeof(int), + cudaMemcpyHostToDevice)); + delete[] cpuPatience; - // Bracket array declaration to memcpy to manually release array from stack - // This is necessary to prevent segmentation faults when running large graphs - { - int cpuOnSiteTime[maxTotalEdges]; - for (int i = 0; i < maxTotalEdges; i++) { - cpuOnSiteTime[i] = call_[i].onSiteTime; - } - HANDLE_ERROR(cudaMemcpy(allEdgesDeviceProps.onSiteTime_, cpuOnSiteTime, - maxTotalEdges * sizeof(int), cudaMemcpyHostToDevice)); + // Use heap memory by using a dynamic array to prevent stack overflow/segmentation faults + int *cpuOnSiteTime = new int[maxTotalEdges]; + for (int i = 0; i < maxTotalEdges; i++) { + cpuOnSiteTime[i] = call_[i].onSiteTime; } - - // Bracket array declaration to memcpy to manually release array from stack - // This is necessary to prevent segmentation faults when running large graphs - { - int cpuResponderType[maxTotalEdges]; - for (int i = 0; i < maxTotalEdges; i++) { - if (call_[i].type == "Law") - cpuResponderType[i] = 7; - else if (call_[i].type == "EMS") - cpuResponderType[i] = 5; - else if (call_[i].type == "Fire") - cpuResponderType[i] = 6; - } - HANDLE_ERROR(cudaMemcpy(allEdgesDeviceProps.responderType_, cpuResponderType, - maxTotalEdges * sizeof(int), cudaMemcpyHostToDevice)); + HANDLE_ERROR(cudaMemcpy(allEdgesDeviceProps.onSiteTime_, cpuOnSiteTime, + maxTotalEdges * sizeof(int), cudaMemcpyHostToDevice)); + delete[] cpuOnSiteTime; + + // Use heap memory by using a dynamic array to prevent stack overflow/segmentation faults + int *cpuResponderType = new int[maxTotalEdges]; + for (int i = 0; i < maxTotalEdges; i++) { + if (call_[i].type == "Law") + cpuResponderType[i] = 7; + else if (call_[i].type == "EMS") + cpuResponderType[i] = 5; + else if (call_[i].type == "Fire") + cpuResponderType[i] = 6; } + HANDLE_ERROR(cudaMemcpy(allEdgesDeviceProps.responderType_, cpuResponderType, + maxTotalEdges * sizeof(int), cudaMemcpyHostToDevice)); + delete[] cpuResponderType; HANDLE_ERROR(cudaMemcpy(allEdgesDevice, &allEdgesDeviceProps, sizeof(All911EdgesDeviceProperties), cudaMemcpyHostToDevice)); @@ -319,98 +308,82 @@ void All911Edges::copyDeviceToHost(All911EdgesDeviceProperties &allEdgesDevicePr HANDLE_ERROR(cudaMemcpy(isRedial_.data(), allEdgesDeviceProps.isRedial_, maxTotalEdges * sizeof(unsigned char), cudaMemcpyDeviceToHost)); - // Bracket array declaration to memcpy to manually release array from stack - // This is necessary to prevent segmentation faults when running large graphs - { - int cpuVertexId[maxTotalEdges]; - HANDLE_ERROR(cudaMemcpy(cpuVertexId, allEdgesDeviceProps.vertexId_, - maxTotalEdges * sizeof(int), cudaMemcpyDeviceToHost)); - for (int i = 0; i < maxTotalEdges; i++) { - call_[i].vertexId = cpuVertexId[i]; - } + // Use heap memory by using a dynamic array to prevent stack overflow/segmentation faults + int *cpuVertexId = new int[maxTotalEdges]; + HANDLE_ERROR(cudaMemcpy(cpuVertexId, allEdgesDeviceProps.vertexId_, maxTotalEdges * sizeof(int), + cudaMemcpyDeviceToHost)); + for (int i = 0; i < maxTotalEdges; i++) { + call_[i].vertexId = cpuVertexId[i]; } + delete[] cpuVertexId; - // Bracket array declaration to memcpy to manually release array from stack - // This is necessary to prevent segmentation faults when running large graphs - { - uint64_t cpuTime[maxTotalEdges]; - HANDLE_ERROR(cudaMemcpy(cpuTime, allEdgesDeviceProps.time_, maxTotalEdges * sizeof(uint64_t), - cudaMemcpyDeviceToHost)); - for (int i = 0; i < maxTotalEdges; i++) { - call_[i].time = cpuTime[i]; - } + // Use heap memory by using a dynamic array to prevent stack overflow/segmentation faults + uint64_t *cpuTime = new uint64_t[maxTotalEdges]; + HANDLE_ERROR(cudaMemcpy(cpuTime, allEdgesDeviceProps.time_, maxTotalEdges * sizeof(uint64_t), + cudaMemcpyDeviceToHost)); + for (int i = 0; i < maxTotalEdges; i++) { + call_[i].time = cpuTime[i]; } + delete[] cpuTime; - // Bracket array declaration to memcpy to manually release array from stack - // This is necessary to prevent segmentation faults when running large graphs - { - int cpuDuration[maxTotalEdges]; - HANDLE_ERROR(cudaMemcpy(cpuDuration, allEdgesDeviceProps.duration_, - maxTotalEdges * sizeof(int), cudaMemcpyDeviceToHost)); - for (int i = 0; i < maxTotalEdges; i++) { - call_[i].duration = cpuDuration[i]; - } + // Use heap memory by using a dynamic array to prevent stack overflow/segmentation faults + int *cpuDuration = new int[maxTotalEdges]; + HANDLE_ERROR(cudaMemcpy(cpuDuration, allEdgesDeviceProps.duration_, maxTotalEdges * sizeof(int), + cudaMemcpyDeviceToHost)); + for (int i = 0; i < maxTotalEdges; i++) { + call_[i].duration = cpuDuration[i]; } + delete[] cpuDuration; - // Bracket array declaration to memcpy to manually release array from stack - // This is necessary to prevent segmentation faults when running large graphs - { - BGFLOAT cpuX[maxTotalEdges]; - HANDLE_ERROR(cudaMemcpy(cpuX, allEdgesDeviceProps.x_, maxTotalEdges * sizeof(BGFLOAT), - cudaMemcpyDeviceToHost)); - for (int i = 0; i < maxTotalEdges; i++) { - call_[i].x = cpuX[i]; - } + // Use heap memory by using a dynamic array to prevent stack overflow/segmentation faults + BGFLOAT *cpuX = new BGFLOAT[maxTotalEdges]; + HANDLE_ERROR(cudaMemcpy(cpuX, allEdgesDeviceProps.x_, maxTotalEdges * sizeof(BGFLOAT), + cudaMemcpyDeviceToHost)); + for (int i = 0; i < maxTotalEdges; i++) { + call_[i].x = cpuX[i]; } + delete[] cpuX; - // Bracket array declaration to memcpy to manually release array from stack - // This is necessary to prevent segmentation faults when running large graphs - { - BGFLOAT cpuY[maxTotalEdges]; - HANDLE_ERROR(cudaMemcpy(cpuY, allEdgesDeviceProps.y_, maxTotalEdges * sizeof(BGFLOAT), - cudaMemcpyDeviceToHost)); - for (int i = 0; i < maxTotalEdges; i++) { - call_[i].y = cpuY[i]; - } + // Use heap memory by using a dynamic array to prevent stack overflow/segmentation faults + BGFLOAT *cpuY = new BGFLOAT[maxTotalEdges]; + HANDLE_ERROR(cudaMemcpy(cpuY, allEdgesDeviceProps.y_, maxTotalEdges * sizeof(BGFLOAT), + cudaMemcpyDeviceToHost)); + for (int i = 0; i < maxTotalEdges; i++) { + call_[i].y = cpuY[i]; } + delete[] cpuY; - // Bracket array declaration to memcpy to manually release array from stack - // This is necessary to prevent segmentation faults when running large graphs - { - int cpuPatience[maxTotalEdges]; - HANDLE_ERROR(cudaMemcpy(cpuPatience, allEdgesDeviceProps.patience_, - maxTotalEdges * sizeof(int), cudaMemcpyDeviceToHost)); - for (int i = 0; i < maxTotalEdges; i++) { - call_[i].patience = cpuPatience[i]; - } + // Use heap memory by using a dynamic array to prevent stack overflow/segmentation faults + int *cpuPatience = new int[maxTotalEdges]; + HANDLE_ERROR(cudaMemcpy(cpuPatience, allEdgesDeviceProps.patience_, maxTotalEdges * sizeof(int), + cudaMemcpyDeviceToHost)); + for (int i = 0; i < maxTotalEdges; i++) { + call_[i].patience = cpuPatience[i]; } + delete[] cpuPatience; - // Bracket array declaration to memcpy to manually release array from stack - // This is necessary to prevent segmentation faults when running large graphs - { - int cpuOnSiteTime[maxTotalEdges]; - HANDLE_ERROR(cudaMemcpy(cpuOnSiteTime, allEdgesDeviceProps.onSiteTime_, - maxTotalEdges * sizeof(int), cudaMemcpyDeviceToHost)); - for (int i = 0; i < maxTotalEdges; i++) { - call_[i].onSiteTime = cpuOnSiteTime[i]; - } + // Use heap memory by using a dynamic array to prevent stack overflow/segmentation faults + int *cpuOnSiteTime = new int[maxTotalEdges]; + HANDLE_ERROR(cudaMemcpy(cpuOnSiteTime, allEdgesDeviceProps.onSiteTime_, + maxTotalEdges * sizeof(int), cudaMemcpyDeviceToHost)); + for (int i = 0; i < maxTotalEdges; i++) { + call_[i].onSiteTime = cpuOnSiteTime[i]; } + delete[] cpuOnSiteTime; - // Bracket array declaration to memcpy to manually release array from stack - // This is necessary to prevent segmentation faults when running large graphs - { - int cpuResponderType[maxTotalEdges]; - HANDLE_ERROR(cudaMemcpy(cpuResponderType, allEdgesDeviceProps.responderType_, - maxTotalEdges * sizeof(int), cudaMemcpyDeviceToHost)); - for (int i = 0; i < maxTotalEdges; i++) { - if (cpuResponderType[i] == 7) - call_[i].type = "Law"; - else if (cpuResponderType[i] == 5) - call_[i].type = "EMS"; - else if (cpuResponderType[i] == 6) - call_[i].type = "Fire"; - } + // Use heap memory by using a dynamic array to prevent stack overflow/segmentation faults + int *cpuResponderType = new int[maxTotalEdges]; + HANDLE_ERROR(cudaMemcpy(cpuResponderType, allEdgesDeviceProps.responderType_, + maxTotalEdges * sizeof(int), cudaMemcpyDeviceToHost)); + for (int i = 0; i < maxTotalEdges; i++) { + if (cpuResponderType[i] == 7) + call_[i].type = "Law"; + else if (cpuResponderType[i] == 5) + call_[i].type = "EMS"; + else if (cpuResponderType[i] == 6) + call_[i].type = "Fire"; } + delete[] cpuResponderType; } /// Get edge_counts in AllEdges struct on device memory. @@ -549,7 +522,7 @@ void All911Edges::printGPUEdgesProps(void *allEdgesDeviceProps) const } } for (int i = 0; i < countVertices_; i++) { - cout << "GPU edgeCounts: " << "vertex[" << i << "]" << edgeCountsPrint[i] << endl; + cout << "GPU edgeCounts:" << "vertex[" << i << "]" << edgeCountsPrint[i] << endl; } cout << "GPU totalEdgeCount: " << totalEdgeCountPrint << endl; cout << "GPU maxEdgesPerVertex: " << maxEdgesPerVertexPrint << endl; diff --git a/Simulator/Recorders/RecordableVector.h b/Simulator/Recorders/RecordableVector.h index 48b705a31..d59a358f0 100644 --- a/Simulator/Recorders/RecordableVector.h +++ b/Simulator/Recorders/RecordableVector.h @@ -93,18 +93,18 @@ template class RecordableVector : public RecordableBase { return dataSeries_; } - /// @brief Gets const pointer to contiguous host memory array - /// @return Const pointer to the first element in host memory + /// @brief Gets pointer to contiguous host memory array + /// @return Pointer to the first element in host memory /// @note Returns nullptr if vector is empty - const T *data() const + T *data() { return dataSeries_.data(); } - /// @brief Gets pointer to contiguous host memory array - /// @return Pointer to the first element in host memory + /// @brief Gets const pointer to contiguous host memory array + /// @return Const pointer to the first element in host memory /// @note Returns nullptr if vector is empty - T *data() + const T *data() const { return dataSeries_.data(); } diff --git a/Simulator/Utils/CircularBuffer.h b/Simulator/Utils/CircularBuffer.h index 8b67de845..ff60faff4 100644 --- a/Simulator/Utils/CircularBuffer.h +++ b/Simulator/Utils/CircularBuffer.h @@ -149,6 +149,39 @@ template class CircularBuffer { return buffer_.size() + front_ - end_; } + std::vector &getBuffer() + { + return buffer_; + } + + /// @brief Accessor for the front index of the circular buffer. + /// @return Returns the front index of the circular buffer. + size_t getFrontIndex() + { + return front_; + } + + /// @brief Accessor for the end index of the circular buffer. + /// @return Returns the end index of the circular buffer. + size_t getEndIndex() + { + return end_; + } + + /// @brief Accessor for the front index of the circular buffer. + /// @return Returns the front index of the circular buffer. + void setFrontIndex(unsigned long front) + { + front_ = front; + } + + /// @brief Accessor for the end index of the circular buffer. + /// @return Returns the end index of the circular buffer. + void setEndIndex(unsigned long end) + { + end_ = end; + } + private: /// Container for holding the buffer elements std::vector buffer_; diff --git a/Simulator/Utils/InputManager.h b/Simulator/Utils/InputManager.h index 86c3d52fb..044d45065 100644 --- a/Simulator/Utils/InputManager.h +++ b/Simulator/Utils/InputManager.h @@ -68,6 +68,8 @@ template class InputManager { /// @brief Constructor InputManager() { + // Initial number of events in the manager is zero + totalNumberOfEvents_ = 0; // Get a copy of the file logger to use with log4cplus macros fileLogger_ = log4cplus::Logger::getInstance(LOG4CPLUS_TEXT("file")); consoleLogger_ = log4cplus::Logger::getInstance(LOG4CPLUS_TEXT("console")); @@ -136,6 +138,7 @@ template class InputManager { // Add the event object to the event map. Map's operator[] creates // and empty queue if it doesn't yet contain this vertex_id. eventsMap_[vertex_id].push(event); + ++totalNumberOfEvents_; } catch (boost::property_tree::ptree_bad_data e) { LOG4CPLUS_FATAL(consoleLogger_, "InputManager failed to read event node: " << e.what()); @@ -188,6 +191,13 @@ template class InputManager { return clockTickUnit_; } + /// @brief Retrieves the total number of events as defined in the input file + /// @return The total number of events in input file + int getTotalNumberOfEvents() + { + return totalNumberOfEvents_; + } + /// @brief Peeks into the event at the front of the vertex queue /// @param vertexId The ID of the vertex /// @throws out_of_range, if vertexId is not found in the map @@ -261,6 +271,9 @@ template class InputManager { int clockTickSize_; string clockTickUnit_; + // Total number of events loaded into the manager + int totalNumberOfEvents_; + log4cplus::Logger fileLogger_; // For logging into a file log4cplus::Logger consoleLogger_; // For logging to console diff --git a/Simulator/Vertices/AllVertices.cpp b/Simulator/Vertices/AllVertices.cpp index b7e43d61e..db82979b7 100644 --- a/Simulator/Vertices/AllVertices.cpp +++ b/Simulator/Vertices/AllVertices.cpp @@ -39,6 +39,12 @@ AllVertices::AllVertices() : size_(0) OperationManager::getInstance().registerOperation(Operations::printParameters, printParametersFunc); + function loadEpochInputsFunc = std::bind( + &AllVertices::loadEpochInputs, this, std::placeholders::_1, std::placeholders::_2); + OperationManager::getInstance().registerOperation(Operations::loadEpochInputs, + loadEpochInputsFunc); + + // Register registerHistoryVariables function as a registerHistoryVariables operation in the OperationManager function registerHistoryVarsFunc = bind(&AllVertices::registerHistoryVariables, this); OperationManager::getInstance().registerOperation(Operations::registerHistoryVariables, @@ -86,7 +92,30 @@ void AllVertices::printParameters() const /// These are inputs occurring in between curStep (inclusive) and /// endStep (exclusive) void AllVertices::loadEpochInputs(uint64_t currentStep, uint64_t endStep) +{ + loadEpochInputsToVertices(currentStep, endStep); +#if defined(USE_GPU) + copyEpochInputsToDevice(); +#endif +} + +void AllVertices::loadEpochInputsToVertices(uint64_t currentStep, uint64_t endStep) { // This is an empty implementation so that Neural Network simulation works // normally -} \ No newline at end of file + LOG4CPLUS_DEBUG(vertexLogger_, "Calling AllVertices::loadEpochInputsToVertices"); +} + +#if defined(USE_GPU) +void AllVertices::copyEpochInputsToDevice() +{ + // This is an empty implementation so that Neural Network simulation works + // normally + LOG4CPLUS_DEBUG(vertexLogger_, "Calling AllVertices::copyEpochInputsToDevice"); +} + +int AllVertices::getNumberOfVerticesNeedingDeviceNoise() const +{ + return Simulator::getInstance().getTotalVertices(); +} +#endif \ No newline at end of file diff --git a/Simulator/Vertices/AllVertices.h b/Simulator/Vertices/AllVertices.h index 73c013318..2316cf920 100644 --- a/Simulator/Vertices/AllVertices.h +++ b/Simulator/Vertices/AllVertices.h @@ -60,7 +60,15 @@ class AllVertices { /// /// @param curStep The current simulation step /// @param endStep The end of epoch simulation step - virtual void loadEpochInputs(uint64_t currentStep, uint64_t endStep); + void loadEpochInputs(uint64_t currentStep, uint64_t endStep); + + /// Loads all inputs scheduled to occur in the upcoming epoch. + /// These are inputs occurring in between curStep (inclusive) and + /// endStep (exclusive) + /// + /// @param curStep The current simulation step + /// @param endStep The end of epoch simulation step + virtual void loadEpochInputsToVertices(uint64_t currentStep, uint64_t endStep); /// Load member variables from configuration file. /// Registered to OperationManager as Operation::loadParameters @@ -116,6 +124,9 @@ class AllVertices { /// virtual void copyFromDevice() = 0; + /// Copies all inputs scheduled to occur in the upcoming epoch onto device. + virtual void copyEpochInputsToDevice(); + /// Update the state of all vertices for a time step /// Notify outgoing edges if vertex has fired. /// @@ -141,6 +152,9 @@ class AllVertices { virtual void integrateVertexInputs(void *allVerticesDevice, EdgeIndexMapDevice *edgeIndexMapDevice, void *allEdgesDevice) = 0; + + /// Get the number of vertices that need device noise + virtual int getNumberOfVerticesNeedingDeviceNoise() const; #else // !defined(USE_GPU) public: /// Update internal state of the indexed vertex (called by every simulation step). diff --git a/Simulator/Vertices/NG911/All911Vertices.cpp b/Simulator/Vertices/NG911/All911Vertices.cpp index bbc9e5fef..a14e820b7 100644 --- a/Simulator/Vertices/NG911/All911Vertices.cpp +++ b/Simulator/Vertices/NG911/All911Vertices.cpp @@ -20,6 +20,13 @@ void All911Vertices::setupVertices() AllVertices::setupVertices(); // Resize and fill vectors with 0 + vertexType_.assign(size_, 0); + beginTimeHistory_.resize(size_); + answerTimeHistory_.resize(size_); + endTimeHistory_.resize(size_); + wasAbandonedHistory_.resize(size_); + queueLengthHistory_.resize(size_); + utilizationHistory_.resize(size_); numServers_.assign(size_, 0); busyServers_.assign(size_, 0); numTrunks_.assign(size_, 0); @@ -27,16 +34,11 @@ void All911Vertices::setupVertices() servingCall_.resize(size_); answerTime_.resize(size_); serverCountdown_.resize(size_); + vertexIdToNoiseIndex_.assign(size_, -1); // Resize and fill data structures for recording droppedCalls_.assign(size_, 0); receivedCalls_.assign(size_, 0); - beginTimeHistory_.resize(size_); - answerTimeHistory_.resize(size_); - endTimeHistory_.resize(size_); - wasAbandonedHistory_.resize(size_); - queueLengthHistory_.resize(size_); - utilizationHistory_.resize(size_); // Register call properties with InputManager inputManager_.registerProperty("vertex_id", &Call::vertexId); @@ -53,47 +55,75 @@ void All911Vertices::setupVertices() // Creates all the Vertices and assigns initial data for them. void All911Vertices::createAllVertices(Layout &layout) { - // Calcualte the total number of time-steps for the data structures that - // will record per-step histories + // Read Input Events using the InputManager + inputManager_.readInputs(); + LOG4CPLUS_DEBUG(vertexLogger_, + "Total number of events: " << inputManager_.getTotalNumberOfEvents()); + Simulator &simulator = Simulator::getInstance(); + // For metrics whose entries are recorded for each time step such as queue length history uint64_t stepsPerEpoch = simulator.getEpochDuration() / simulator.getDeltaT(); - uint64_t totalTimeSteps = stepsPerEpoch * simulator.getNumEpochs(); - BGFLOAT epochDuration = simulator.getEpochDuration(); - BGFLOAT deltaT = simulator.getDeltaT(); + // For metrics whose entries are recorded for each call such as begin time history + int maxEventsPerEpoch = static_cast(Simulator::getInstance().getEpochDuration() + * Simulator::getInstance().getMaxFiringRate()); + LOG4CPLUS_DEBUG(vertexLogger_, "Steps per epoch: " << stepsPerEpoch); + LOG4CPLUS_DEBUG(vertexLogger_, "Max events per epoch: " << maxEventsPerEpoch); - // Loop over all vertices and set the number of servers and trunks, and - // determine the size of the waiting queue. + // Loop over all vertices and set the number of servers and trunks. // We get the information needed from the GraphManager. GraphManager::VertexIterator vi, vi_end; GraphManager &gm = GraphManager::getInstance(); + // Variable to map caller region IDs to 0 to n-1 where n is the number of caller regions. + // This allows caller regions to exist anywhere in the graph file + numberOfVerticesNeedingDeviceNoise_ = 0; for (boost::tie(vi, vi_end) = gm.vertices(); vi != vi_end; ++vi) { assert(*vi < size_); if (gm[*vi].type == "CALR") { - vertexQueues_[*vi].resize(stepsPerEpoch); + vertexType_[*vi] = 3; + vertexIdToNoiseIndex_[*vi] = numberOfVerticesNeedingDeviceNoise_; + numberOfVerticesNeedingDeviceNoise_++; } else { + if (gm[*vi].type == "PSAP") { + vertexType_[*vi] = 4; + } else if (gm[*vi].type == "EMS") { + vertexType_[*vi] = 5; + } else if (gm[*vi].type == "FIRE") { + vertexType_[*vi] = 6; + } else if (gm[*vi].type == "LAW") { + vertexType_[*vi] = 7; + } numServers_[*vi] = gm[*vi].servers; numTrunks_[*vi] = gm[*vi].trunks; // We should not have more servers than trunks assert(numServers_[*vi] <= numTrunks_[*vi]); - - // The waiting queue is of size # trunks. We keep track of the # of busy servers - // to know when there are no more trunks available. - vertexQueues_[*vi].resize(numTrunks_[*vi]); - - // Initialize the data structures for agent availability - servingCall_[*vi].resize(gm[*vi].servers); - answerTime_[*vi].resize(gm[*vi].servers); - serverCountdown_[*vi].assign(gm[*vi].servers, 0); - - // Initialize the data structures for system metrics - queueLengthHistory_[*vi].assign(totalTimeSteps, 0); - utilizationHistory_[*vi].assign(totalTimeSteps, 0); + if (maxNumberOfServers_ < numServers_[*vi]) { + maxNumberOfServers_ = numServers_[*vi]; + } } } - // Read Input Events using the InputManager - inputManager_.readInputs(); + LOG4CPLUS_DEBUG(vertexLogger_, "Number of vertices needing device noise: " + << numberOfVerticesNeedingDeviceNoise_); + LOG4CPLUS_DEBUG(vertexLogger_, "Max number of servers: " << maxNumberOfServers_); + + // Loop over the vertices again to appropriate resize data members such that + // each data member used the same size for all of it's vertices. This is to + // help with mirroring the implementation on the GPU. + for (int vertexId = 0; vertexId < size_; vertexId++) { + // Initialize the data structures for system metrics + beginTimeHistory_[vertexId].resize(maxEventsPerEpoch); + answerTimeHistory_[vertexId].resize(maxEventsPerEpoch); + endTimeHistory_[vertexId].resize(maxEventsPerEpoch); + wasAbandonedHistory_[vertexId].resize(maxEventsPerEpoch); + queueLengthHistory_[vertexId].resize(stepsPerEpoch); + utilizationHistory_[vertexId].resize(stepsPerEpoch); + vertexQueues_[vertexId].resize(stepsPerEpoch); + // Initialize the data structures for agent availability + servingCall_[vertexId].resize(maxNumberOfServers_); + answerTime_[vertexId].resize(maxNumberOfServers_); + serverCountdown_[vertexId].assign(maxNumberOfServers_, 0); + } } @@ -118,8 +148,9 @@ string All911Vertices::toString(int index) const // Loads all inputs scheduled to occur in the upcoming epoch. -void All911Vertices::loadEpochInputs(uint64_t currentStep, uint64_t endStep) +void All911Vertices::loadEpochInputsToVertices(uint64_t currentStep, uint64_t endStep) { + LOG4CPLUS_DEBUG(fileLogger_, "Calling All911Vertices::loadEpochInputsToVertices"); Simulator &simulator = Simulator::getInstance(); Layout &layout = simulator.getModel().getLayout(); @@ -141,7 +172,7 @@ void All911Vertices::registerHistoryVariables() // Registering the following variables to be recorded recorder.registerVariable("numTrunks", numTrunks_, Recorder::UpdatedType::CONSTANT); recorder.registerVariable("numServers", numServers_, Recorder::UpdatedType::CONSTANT); - recorder.registerVariable("droppedCalls", droppedCalls_, Recorder::UpdatedType::DYNAMIC); + recorder.registerVariable("droppedCalls", droppedCalls_, Recorder::UpdatedType::CONSTANT); recorder.registerVariable("receivedCalls", receivedCalls_, Recorder::UpdatedType::CONSTANT); for (int i = 0; i < beginTimeHistory_.size(); i++) { @@ -231,22 +262,48 @@ void All911Vertices::integrateVertexInputs(AllEdges &edges, EdgeIndexMap &edgeIn assert(dst == vertex); CircularBuffer &dstQueue = getQueue(dst); - if (dstQueue.size() >= (dstQueue.capacity() - busyServers(dst))) { + // Compute the size of the destination queue + // Allows us to use larger capacity queues but treat them like they are smaller + // to simplify the mirroring on the GPU. + uint64_t dstQueueSize; + uint64_t queueFrontIndex = dstQueue.getFrontIndex(); + uint64_t queueEndIndex = dstQueue.getEndIndex(); + if (queueFrontIndex >= queueEndIndex) { + dstQueueSize = queueFrontIndex - queueEndIndex; + } else { + // Internal CircularBuffer buffer size is capacity + 1 + dstQueueSize = numTrunks_[dst] + 1 + queueFrontIndex - queueEndIndex; + } + + // Compute the capacity of the destination queue + int dstQueueCapacity = numTrunks_[dst]; + // dstQueueSize can't be negative but we need to be able to compare it to a possible negative waiting queue + // so cast the size to an int for comparison + if ((int)dstQueueSize >= (dstQueueCapacity - busyServers(dst))) { // Call is dropped because there is no space in the waiting queue if (!all911Edges.isRedial_[edgeIdx]) { // Only count the dropped call if it's not a redial droppedCalls(dst)++; // Record that we received a call receivedCalls(dst)++; - LOG4CPLUS_DEBUG(vertexLogger_, - "Call dropped: " << droppedCalls(dst) - << ", time: " << all911Edges.call_[edgeIdx].time - << ", vertex: " << dst - << ", queue size: " << dstQueue.size()); + LOG4CPLUS_DEBUG(vertexLogger_, "Call dropped: " << droppedCalls(dst) << ", time: " + << all911Edges.call_[edgeIdx].time + << ", vertex: " << dst + << ", queue size: " << dstQueueSize); } } else { + // int queueFull = (int)((1 - (queueFrontIndex >= queueEndIndex))*(numTrunks_[dst] + 1) + queueFrontIndex - queueEndIndex) >= (dstQueueCapacity - busyServers(dst)); + // droppedCalls(dst) += queueFull && (!all911Edges.isRedial_[edgeIdx]); + // receivedCalls(dst) += queueFull && (!all911Edges.isRedial_[edgeIdx]); + // if (!queueFull) { + // Internal CircularBuffer buffer size is capacity + 1 + // // Transfer call to destination - dstQueue.put(all911Edges.call_[edgeIdx]); + assert(((queueFrontIndex + 1) % numTrunks_[dst] + 1) != queueEndIndex); + vector &queueBuffer = dstQueue.getBuffer(); + queueBuffer[queueFrontIndex] = all911Edges.call_[edgeIdx]; + uint64_t newFrontIndex = (queueFrontIndex + 1) % (numTrunks_[dst] + 1); + dstQueue.setFrontIndex(newFrontIndex); // Record that we received a call receivedCalls(dst)++; all911Edges.isAvailable_[edgeIdx] = true; @@ -261,9 +318,6 @@ void All911Vertices::advanceVertices(AllEdges &edges, const EdgeIndexMap &edgeIn { Simulator &simulator = Simulator::getInstance(); Layout &layout = simulator.getModel().getLayout(); - uint64_t endEpochStep - = g_simulationStep - + static_cast(simulator.getEpochDuration() / simulator.getDeltaT()); All911Edges &edges911 = dynamic_cast(edges); @@ -289,6 +343,7 @@ void All911Vertices::advanceCALR(BGSIZE vertexIdx, All911Edges &edges911, // There is only one outgoing edge from CALR to a PSAP BGSIZE start = edgeIndexMap.outgoingEdgeBegin_[vertexIdx]; BGSIZE edgeIdx = edgeIndexMap.outgoingEdgeIndexMap_[start]; + //BGSIZE edgeIdx = edgeIndexMap.outgoingEdgeIndexMap_[edgeIndexMap.outgoingEdgeBegin_[vertexIdx]]; // Check for dropped calls, indicated by the edge not being available if (!edges911.isAvailable_[edgeIdx]) { @@ -306,6 +361,14 @@ void All911Vertices::advanceCALR(BGSIZE vertexIdx, All911Edges &edges911, } } + // unsigned char makeAvailable = (1 - edges911.isAvailable_[edgeIdx]) * (1 - edges911.isRedial_[edgeIdx]) * (unsigned char)(initRNG.randDblExc() >= redialP_); + + // edges911.isAvailable_[edgeIdx] |= makeAvailable; + // edges911.isRedial_[edgeIdx] |= (1 - edges911.isAvailable_[edgeIdx]) * (1 - makeAvailable); + + // We can use CircularBuffer methods because we don't need the caller region queue + // to behave like it only has a capacity of numTrunks_ like we do for other vertices. + // // peek at the next call in the queue optional nextCall = vertexQueues_[vertexIdx].peek(); if (edges911.isAvailable_[edgeIdx] && nextCall && nextCall->time <= g_simulationStep) { @@ -326,32 +389,39 @@ void All911Vertices::advanceCALR(BGSIZE vertexIdx, All911Edges &edges911, void All911Vertices::advancePSAP(BGSIZE vertexIdx, All911Edges &edges911, const EdgeIndexMap &edgeIndexMap) { + int numberOfServers = numServers_[vertexIdx]; // Loop over all servers and free the ones finishing serving calls - vector availableServers; - for (size_t server = 0; server < serverCountdown_[vertexIdx].size(); ++server) { + int numberOfAvailableServers = 0; + vector + availableServers; // Use vector but treat like array to better mirror on GPU + availableServers.reserve(numberOfServers); + // Initialize to no servers having been assigned a call yet + for (BGSIZE serverIndex = 0; serverIndex < numberOfServers; serverIndex++) { + availableServers[serverIndex] = false; + } + for (size_t server = 0; server < numberOfServers; ++server) { if (serverCountdown_[vertexIdx][server] == 0) { // Server is available to take calls. This check is needed because calls // could have duration of zero or server has not been assigned a call yet - availableServers.push_back(server); + availableServers[server] = true; + numberOfAvailableServers++; } else if (--serverCountdown_[vertexIdx][server] == 0) { // Server becomes free to take calls // TODO: What about wrap-up time? Call &endingCall = servingCall_[vertexIdx][server]; //Store call metrics - wasAbandonedHistory_[vertexIdx].push_back(false); - beginTimeHistory_[vertexIdx].push_back(endingCall.time); - answerTimeHistory_[vertexIdx].push_back(answerTime_[vertexIdx][server]); - endTimeHistory_[vertexIdx].push_back(g_simulationStep); + wasAbandonedHistory_[vertexIdx].insertEvent(false); + beginTimeHistory_[vertexIdx].insertEvent(endingCall.time); + answerTimeHistory_[vertexIdx].insertEvent(answerTime_[vertexIdx][server]); + endTimeHistory_[vertexIdx].insertEvent(g_simulationStep); LOG4CPLUS_DEBUG(vertexLogger_, "Finishing call, begin time: " << endingCall.time << ", end time: " << g_simulationStep << ", waited: " << answerTime_[vertexIdx][server] - endingCall.time); // Dispatch the Responder closest to the emergency location. - Connections911 &conn911 - = dynamic_cast(Simulator::getInstance().getModel().getConnections()); - BGSIZE respEdge = conn911.getEdgeToClosestResponder(endingCall, vertexIdx); + BGSIZE respEdge = getEdgeToClosestResponder(endingCall, vertexIdx); BGSIZE responder = edges911.destVertexIndex_[respEdge]; LOG4CPLUS_DEBUG(vertexLogger_, "Dispatching Responder: " << responder); @@ -363,51 +433,73 @@ void All911Vertices::advancePSAP(BGSIZE vertexIdx, All911Edges &edges911, // This assumes that the caller doesn't stay in the line until the responder // arrives on scene. This not true in all instances. - availableServers.push_back(server); + availableServers[server] = true; + numberOfAvailableServers++; } } + // Need the initial number of servers for utilization metric as well as a number of servers that can change + // during the while loop iterations + int currentlyAvailableServers = numberOfAvailableServers; // Assign calls to servers until either no servers are available or // there are no more calls in the waiting queue - size_t serverId = 0; - while (serverId < availableServers.size() && !vertexQueues_[vertexIdx].isEmpty()) { + while (currentlyAvailableServers > 0 && !vertexQueues_[vertexIdx].isEmpty()) { // TODO: calls with duration of zero are being added but because countdown will be zero // they don't show up in the logs - optional call = vertexQueues_[vertexIdx].get(); - assert(call); - - if (call->patience < (g_simulationStep - call->time)) { + // + // Internal CircularBuffer buffer size is capacity + 1 + vector queueBuffer = vertexQueues_[vertexIdx].getBuffer(); + uint64_t queueEnd = vertexQueues_[vertexIdx].getEndIndex(); + Call call = queueBuffer[queueEnd]; + uint64_t newEndIndex = (queueEnd + 1) % (numTrunks_[vertexIdx] + 1); + vertexQueues_[vertexIdx].setEndIndex(newEndIndex); + + if (call.patience < (g_simulationStep - call.time)) { // If the patience time is less than the waiting time, the call is abandoned - wasAbandonedHistory_[vertexIdx].push_back(true); - beginTimeHistory_[vertexIdx].push_back(call->time); + wasAbandonedHistory_[vertexIdx].insertEvent(true); + beginTimeHistory_[vertexIdx].insertEvent(call.time); // Answer time and end time get zero as sentinel for non-valid values - answerTimeHistory_[vertexIdx].push_back(0); - endTimeHistory_[vertexIdx].push_back(0); + answerTimeHistory_[vertexIdx].insertEvent(0); + endTimeHistory_[vertexIdx].insertEvent(0); LOG4CPLUS_DEBUG(vertexLogger_, "Call was abandoned, Patience: " - << call->patience - << " Ring Time: " << g_simulationStep - call->time); + << call.patience + << " Ring Time: " << g_simulationStep - call.time); } else { // The available server starts serving the call - int availServer = availableServers[serverId]; - servingCall_[vertexIdx][availServer] = call.value(); + int availServer; + for (BGSIZE serverIndex = 0; serverIndex < numberOfServers; serverIndex++) { + if (availableServers[serverIndex] == true) { + // If server is available, have that server serve the call + availServer = serverIndex; + availableServers[serverIndex] = false; + currentlyAvailableServers--; + break; + } + } + servingCall_[vertexIdx][availServer] = call; answerTime_[vertexIdx][availServer] = g_simulationStep; - serverCountdown_[vertexIdx][availServer] = call.value().duration; + serverCountdown_[vertexIdx][availServer] = call.duration; LOG4CPLUS_DEBUG(vertexLogger_, "Serving Call starting at time: " - << call->time << ", sim-step: " << g_simulationStep); - // Next server - ++serverId; + << call.time << ", sim-step: " << g_simulationStep); } } // Update number of busy servers. This is used to check if there is space in the queue - busyServers_[vertexIdx] = numServers_[vertexIdx] - availableServers.size(); + busyServers_[vertexIdx] = numberOfServers - numberOfAvailableServers; // Update queueLength and utilization histories - queueLengthHistory_[vertexIdx].resize(g_simulationStep + 1); - queueLengthHistory_[vertexIdx][g_simulationStep] = vertexQueues_[vertexIdx].size(); - utilizationHistory_[vertexIdx].resize(g_simulationStep + 1); - utilizationHistory_[vertexIdx][g_simulationStep] - = static_cast(busyServers_[vertexIdx]) / numServers_[vertexIdx]; + uint64_t queueSize; + uint64_t queueFront = vertexQueues_[vertexIdx].getFrontIndex(); + uint64_t queueEnd = vertexQueues_[vertexIdx].getEndIndex(); + if (queueFront >= queueEnd) { + queueSize = queueFront - queueEnd; + } else { + // Internal CircularBuffer buffer size is capacity + 1 + queueSize = numTrunks_[vertexIdx] + 1 + queueFront - queueEnd; + } + queueLengthHistory_[vertexIdx].insertEvent(queueSize); + utilizationHistory_[vertexIdx].insertEvent(static_cast(busyServers_[vertexIdx]) + / numberOfServers); } @@ -418,42 +510,90 @@ void All911Vertices::advanceRESP(BGSIZE vertexIdx, All911Edges &edges911, Layout &layout = Simulator::getInstance().getModel().getLayout(); Layout911 &layout911 = dynamic_cast(layout); + //int numberOfUnits = numServers_[vertexIdx]; // Free the units finishing up with emergency responses - vector availableUnits; - for (size_t unit = 0; unit < serverCountdown_[vertexIdx].size(); ++unit) { + int numberOfAvailableUnits = 0; + vector + availableUnits; // Use vector but treat like array to better mirror on GPU + availableUnits.reserve(numServers_[vertexIdx]); + for (BGSIZE unitIndex = 0; unitIndex < numServers_[vertexIdx]; unitIndex++) { + availableUnits[unitIndex] = false; + } + for (size_t unit = 0; unit < numServers_[vertexIdx]; ++unit) { + // int countdown = serverCountdown_[vertexIdx][unit]; + // // Check if countdown was already 0 + // int countdownWasZero = countdown == 0; + + // // Decrement if it was not already 0 + // countdown -= (1 - countdownWasZero); + // serverCountdown_[vertexIdx][unit] = countdown; + + // // Countdown became zero after decrement so unit is becoming available + // //int countdownNowZero = countdown == 0; + + // // Set the available unit if it was already available or became available + // availableUnits[unit] = (unsigned char)(countdown == 0); + // numberOfAvailableUnits += (countdown == 0); + + // // If it became zero, the unit responds to the new incident + // //int countdownBecameZero = (!countdownWasZero) & countdownNowZero; + // if ((!countdownWasZero) & (countdown == 0)) { if (serverCountdown_[vertexIdx][unit] == 0) { // Unit is available - availableUnits.push_back(unit); + availableUnits[unit] = true; + numberOfAvailableUnits++; } else if (--serverCountdown_[vertexIdx][unit] == 0) { // Unit becomes available to responde to new incidents Call &endingIncident = servingCall_[vertexIdx][unit]; //Store incident response metrics - wasAbandonedHistory_[vertexIdx].push_back(false); - beginTimeHistory_[vertexIdx].push_back(endingIncident.time); - answerTimeHistory_[vertexIdx].push_back(answerTime_[vertexIdx][unit]); - endTimeHistory_[vertexIdx].push_back(g_simulationStep); + wasAbandonedHistory_[vertexIdx].insertEvent(false); + beginTimeHistory_[vertexIdx].insertEvent(endingIncident.time); + answerTimeHistory_[vertexIdx].insertEvent(answerTime_[vertexIdx][unit]); + endTimeHistory_[vertexIdx].insertEvent(g_simulationStep); LOG4CPLUS_DEBUG(vertexLogger_, "Finishing response, begin time: " << endingIncident.time << ", end time: " << g_simulationStep << ", waited: " << answerTime_[vertexIdx][unit] - endingIncident.time); // Unit is added to available units - availableUnits.push_back(unit); + availableUnits[unit] = true; + numberOfAvailableUnits++; } } // Assign reponse dispatches until no units are available or there are no more // incidents in the waiting queue - for (size_t unit = 0; unit < availableUnits.size() && !vertexQueues_[vertexIdx].isEmpty(); + for (size_t unit = 0; unit < numberOfAvailableUnits && !vertexQueues_[vertexIdx].isEmpty(); ++unit) { - optional incident = vertexQueues_[vertexIdx].get(); - assert(incident); // Safety check for valid incidents + // Internal CircularBuffer buffer size is capacity + 1 + vector queueBuffer = vertexQueues_[vertexIdx].getBuffer(); + uint64_t queueEnd = vertexQueues_[vertexIdx].getEndIndex(); + Call incident = queueBuffer[queueEnd]; + uint64_t newEndIndex = (queueEnd + 1) % (numTrunks_[vertexIdx] + 1); + vertexQueues_[vertexIdx].setEndIndex(newEndIndex); // The available unit starts serving the call - int availUnit = availableUnits[unit]; - servingCall_[vertexIdx][availUnit] = incident.value(); + int availUnit; + for (BGSIZE unitIndex = 0; unitIndex < numServers_[vertexIdx]; unitIndex++) { + if (availableUnits[unitIndex] == true) { + // If server is available, have that server serve the call + availUnit = unitIndex; + availableUnits[unitIndex] = false; + break; + } + } + // int availUnit = -1; + // for(BGSIZE unitIndex = 0; unitIndex < numServers_[vertexIdx]; unitIndex++) { + // //int unitIsAvailable = availableUnits[unitIndex] == true; + // //int unitNotFound = availUnit == -1; + // // Add 0 if unit is not available or 1 + unitIndex if it's available and a unit has not already been found + // availUnit += (availableUnits[unitIndex] == true && availUnit == -1) * (unitIndex + 1); + // // Flip value only if the unit is available and a unit has not been found + // availableUnits[unitIndex] = (unsigned char)(availableUnits[unitIndex] == true - (availableUnits[unitIndex] == true && availUnit == -1)); + // } + servingCall_[vertexIdx][availUnit] = incident; answerTime_[vertexIdx][availUnit] = g_simulationStep; // We need to calculate the distance in miles but the x and y coordinates @@ -465,28 +605,83 @@ void All911Vertices::advanceRESP(BGSIZE vertexIdx, All911Edges &edges911, // 1 degree of longitude = cos(latitude) * 69.172 double lngDegreeLength = cos(layout911.yloc_[vertexIdx] * (pi / 180)) * 69.172; double latDegreeLength = 69.0; - double deltaLng = incident->x - layout911.xloc_[vertexIdx]; - double deltaLat = incident->y - layout911.yloc_[vertexIdx]; + double deltaLng = incident.x - layout911.xloc_[vertexIdx]; + double deltaLat = incident.y - layout911.yloc_[vertexIdx]; double dist2incident = sqrt(pow(deltaLng * lngDegreeLength, 2) + pow(deltaLat * latDegreeLength, 2)); // Calculate the driving time to the incident in seconds double driveTime = (dist2incident / avgDrivingSpeed_) * 3600; - serverCountdown_[vertexIdx][availUnit] = driveTime + incident->onSiteTime; + serverCountdown_[vertexIdx][availUnit] = driveTime + incident.onSiteTime; - serverCountdown_[vertexIdx][availUnit] = incident.value().duration; + serverCountdown_[vertexIdx][availUnit] = incident.duration; LOG4CPLUS_DEBUG(vertexLogger_, "Response, driving time: " << driveTime << ", On-site time: " - << incident->onSiteTime); + << incident.onSiteTime); } // Update number of busy servers. This is used to check if there is space in the queue - busyServers_[vertexIdx] = numServers_[vertexIdx] - availableUnits.size(); + busyServers_[vertexIdx] = numServers_[vertexIdx] - numberOfAvailableUnits; // Update queueLength and utilization histories - queueLengthHistory_[vertexIdx].resize(g_simulationStep + 1); - queueLengthHistory_[vertexIdx][g_simulationStep] = vertexQueues_[vertexIdx].size(); - utilizationHistory_[vertexIdx].resize(g_simulationStep + 1); - utilizationHistory_[vertexIdx][g_simulationStep] - = static_cast(busyServers_[vertexIdx]) / numServers_[vertexIdx]; + uint64_t queueSize; + uint64_t queueFront = vertexQueues_[vertexIdx].getFrontIndex(); + uint64_t queueEnd = vertexQueues_[vertexIdx].getEndIndex(); + if (queueFront >= queueEnd) { + queueSize = queueFront - queueEnd; + } else { + // Internal CircularBuffer buffer size is capacity + 1 + queueSize = numTrunks_[vertexIdx] + 1 + queueFront - queueEnd; + } + queueLengthHistory_[vertexIdx].insertEvent(queueSize); + utilizationHistory_[vertexIdx].insertEvent(static_cast(busyServers_[vertexIdx]) + / numServers_[vertexIdx]); +} + + +/// Finds the outgoing edge from the given vertex to the Responder closest to +/// the emergency call location +BGSIZE All911Vertices::getEdgeToClosestResponder(const Call &call, BGSIZE vertexIdx) +{ + Connections &connections = Simulator::getInstance().getModel().getConnections(); + All911Edges &edges911 = dynamic_cast(connections.getEdges()); + EdgeIndexMap &edgeIndexMap = connections.getEdgeIndexMap(); + + vertexType requiredType; + if (call.type == "Law") + requiredType = vertexType::LAW; + else if (call.type == "EMS") + requiredType = vertexType::EMS; + else if (call.type == "Fire") + requiredType = vertexType::FIRE; + + // loop over the outgoing edges looking for the responder with the shortest + // Euclidean distance to the call's location. + BGSIZE startOutEdg = edgeIndexMap.outgoingEdgeBegin_[vertexIdx]; + BGSIZE outEdgCount = edgeIndexMap.outgoingEdgeCount_[vertexIdx]; + Layout911 &layout911 + = dynamic_cast(Simulator::getInstance().getModel().getLayout()); + + BGSIZE resp, respEdge; + double minDistance = numeric_limits::max(); + for (BGSIZE eIdxMap = startOutEdg; eIdxMap < startOutEdg + outEdgCount; ++eIdxMap) { + BGSIZE outEdg = edgeIndexMap.outgoingEdgeIndexMap_[eIdxMap]; + assert(edges911.inUse_[outEdg]); // Edge must be in use + + BGSIZE dstVertex = edges911.destVertexIndex_[outEdg]; + if (layout911.vertexTypeMap_[dstVertex] == requiredType) { + double distance = layout911.getDistance(dstVertex, call.x, call.y); + + if (distance < minDistance) { + minDistance = distance; + resp = dstVertex; + respEdge = outEdg; + } + } + } + + // We must have found the closest responder of the right type + assert(minDistance < numeric_limits::max()); + assert(layout911.vertexTypeMap_[resp] == requiredType); + return respEdge; } #endif \ No newline at end of file diff --git a/Simulator/Vertices/NG911/All911Vertices.h b/Simulator/Vertices/NG911/All911Vertices.h index 48a37d988..4dd033e4e 100644 --- a/Simulator/Vertices/NG911/All911Vertices.h +++ b/Simulator/Vertices/NG911/All911Vertices.h @@ -67,6 +67,7 @@ #include "AllVertices.h" #include "CircularBuffer.h" +#include "EventBuffer.h" #include "Global.h" #include "InputEvent.h" #include "InputManager.h" @@ -74,6 +75,7 @@ // Forward declaration to avoid circular reference class All911Edges; +struct All911VerticesDeviceProperties; // Class to hold all data necessary for all the Vertices. class All911Vertices : public AllVertices { @@ -119,7 +121,7 @@ class All911Vertices : public AllVertices { /// Loads all inputs scheduled to occur in the upcoming epoch. /// These are inputs occurring in between curStep (inclusive) and /// endStep (exclusive) - virtual void loadEpochInputs(uint64_t currentStep, uint64_t endStep) override; + virtual void loadEpochInputsToVertices(uint64_t currentStep, uint64_t endStep) override; /// unused virtual function placeholder virtual void registerHistoryVariables() override; @@ -148,20 +150,20 @@ class All911Vertices : public AllVertices { /// @return The number of busy servers in the given vertex int busyServers(int vIdx) const; -private: + /// Index each vertex and record it's type + vector vertexType_; /// The starting time for every call - vector> beginTimeHistory_; + vector> beginTimeHistory_; /// The answer time for every call - vector> answerTimeHistory_; + vector> answerTimeHistory_; /// The end time for every call - vector> endTimeHistory_; + vector> endTimeHistory_; /// True if the call was abandoned - vector> - wasAbandonedHistory_; // changed to bool from unsigned char + vector> wasAbandonedHistory_; // changed to bool from unsigned char /// The length of the waiting queue at every time-step - vector> queueLengthHistory_; + vector> queueLengthHistory_; /// The portion of servers that are busy at every time-step - vector> utilizationHistory_; + vector> utilizationHistory_; /// These are the queues where calls will wait to be served vector> vertexQueues_; @@ -175,6 +177,8 @@ class All911Vertices : public AllVertices { /// Number of servers currently serving calls vector busyServers_; + // Record the max number of servers for GPU memory allocation + int maxNumberOfServers_; /// Number of servers. In a PSAP these are the call takers, in Responder nodes /// they are responder units RecordableVector numServers_; @@ -200,6 +204,27 @@ class All911Vertices : public AllVertices { /// The InputManager holds all the Input Events for the simulation InputManager inputManager_; + /// Mapping of the vertex ID to the index in the noise array. Only caller regions + /// need noise for determining if a redial occurs. Caller regions have a value + /// 0 to n where n is the number of caller regions. Non-caller regions have a + /// value of -1. + vector vertexIdToNoiseIndex_; + +protected: + /// Finds the outgoing edge from the given vertex to the Responder closest to + /// the emergency call location + /// + /// @param call The call that needs a Responder + /// @param vertexIdx The index of the vertex serving the call (A PSAP) + /// @return The index of the outgoing edge to the closest Responder + BGSIZE getEdgeToClosestResponder(const Call &call, BGSIZE vertexIdx); + + /// The number of vertices that needs device noise. Only caller regions need noise for determining + /// redial so this is meant to help save memory. A member variable is used so that we don't have to + /// recompute this value multiple times. + int numberOfVerticesNeedingDeviceNoise_; + +private: /// Advance a CALR vertex. Send calls to the appropriate PSAP /// /// @param vertexIdx Index of the CALR vertex @@ -225,14 +250,14 @@ class All911Vertices : public AllVertices { // GPU functionality for 911 simulation is unimplemented. // These signatures are required to make the class non-abstract public: - virtual void allocVerticesDeviceStruct() {}; - virtual void deleteVerticesDeviceStruct() {}; - virtual void copyToDevice() {}; - virtual void copyFromDevice() {}; + virtual void allocVerticesDeviceStruct() override; + virtual void deleteVerticesDeviceStruct() override; + virtual void copyToDevice() override; + virtual void copyFromDevice() override; virtual void advanceVertices(AllEdges &edges, void *allVerticesDevice, void *allEdgesDevice, - float randNoise[], EdgeIndexMapDevice *edgeIndexMapDevice) {}; - virtual void setAdvanceVerticesDeviceParams(AllEdges &edges) {}; - virtual void clearVertexHistory(void *allVerticesDevice) {}; + float randNoise[], EdgeIndexMapDevice *edgeIndexMapDevice) override; + virtual void setAdvanceVerticesDeviceParams(AllEdges &edges) override; + virtual void clearVertexHistory(void *allVerticesDevice) override; /// Performs an integration operation per vertex using the inputs to the vertex. /// @@ -241,7 +266,25 @@ class All911Vertices : public AllVertices { /// @param allEdgesDevice GPU address of the allEdges struct on device memory. virtual void integrateVertexInputs(void *allVerticesDevice, EdgeIndexMapDevice *edgeIndexMapDevice, - void *allEdgesDevice) {}; + void *allEdgesDevice) override; + /// Copies all inputs scheduled to occur in the upcoming epoch onto device. + virtual void copyEpochInputsToDevice() override; + virtual int getNumberOfVerticesNeedingDeviceNoise() const override; + +protected: + /// Allocate GPU memories to store all vertices' states. + /// (Helper function of allocVerticesDeviceStruct) + /// @param allVerticesDevice Reference to the All911VerticesDeviceProperties struct. + void allocDeviceStruct(All911VerticesDeviceProperties &allVerticesDevice); + void deleteDeviceStruct(All911VerticesDeviceProperties &allVerticesDevice); + void copyVertexQueuesToDevice(int numberOfVertices, uint64_t stepsPerEpoch, + All911VerticesDeviceProperties &allVerticesDevice); + void copyVertexQueuesFromDevice(int numberOfVertices, uint64_t stepsPerEpoch, + All911VerticesDeviceProperties &allVerticesDevice); + void copyServingCallToDevice(int numberOfVertices, + All911VerticesDeviceProperties &allVerticesDevice); + void copyServingCallFromDevice(int numberOfVertices, + All911VerticesDeviceProperties &allVerticesDevice); #else // !defined(USE_GPU) public: /// Update internal state of the indexed Vertex (called by every simulation step). @@ -260,4 +303,117 @@ class All911Vertices : public AllVertices { protected: #endif // defined(USE_GPU) -}; \ No newline at end of file +}; + +#if defined(USE_GPU) +struct All911VerticesDeviceProperties : public AllVerticesDeviceProperties { + /// Index each vertex and record it's type + int *vertexType_; + /// The starting time for every call + //vector> beginTimeHistory_; + uint64_t **beginTimeHistory_; + int *beginTimeHistoryBufferFront_; + int *beginTimeHistoryBufferEnd_; + int *beginTimeHistoryEpochStart_; + int *beginTimeHistoryNumElementsInEpoch_; + /// The answer time for every call + //vector> answerTimeHistory_; + uint64_t **answerTimeHistory_; + int *answerTimeHistoryBufferFront_; + int *answerTimeHistoryBufferEnd_; + int *answerTimeHistoryEpochStart_; + int *answerTimeHistoryNumElementsInEpoch_; + /// The end time for every call + //vector> endTimeHistory_; + uint64_t **endTimeHistory_; + int *endTimeHistoryBufferFront_; + int *endTimeHistoryBufferEnd_; + int *endTimeHistoryEpochStart_; + int *endTimeHistoryNumElementsInEpoch_; + /// True if the call was abandoned + //vector> wasAbandonedHistory_; + uint64_t **wasAbandonedHistory_; + int *wasAbandonedHistoryBufferFront_; + int *wasAbandonedHistoryBufferEnd_; + int *wasAbandonedHistoryEpochStart_; + int *wasAbandonedHistoryNumElementsInEpoch_; + /// The length of the waiting queue at every time-step + //vector> queueLengthHistory_; + uint64_t **queueLengthHistory_; + int *queueLengthHistoryBufferFront_; + int *queueLengthHistoryBufferEnd_; + int *queueLengthHistoryEpochStart_; + int *queueLengthHistoryNumElementsInEpoch_; + /// The portion of servers that are busy at every time-step + //vector> utilizationHistory_; + BGFLOAT **utilizationHistory_; + int *utilizationHistoryBufferFront_; + int *utilizationHistoryBufferEnd_; + int *utilizationHistoryEpochStart_; + int *utilizationHistoryNumElementsInEpoch_; + + /// These are the queues where calls will wait to be served + //vector> vertexQueues_; + int **vertexQueuesBufferVertexId_; + uint64_t **vertexQueuesBufferTime_; + int **vertexQueuesBufferDuration_; + BGFLOAT **vertexQueuesBufferX_; + BGFLOAT **vertexQueuesBufferY_; + int **vertexQueuesBufferPatience_; + int **vertexQueuesBufferOnSiteTime_; + int **vertexQueuesBufferResponderType_; + uint64_t *vertexQueuesFront_; + uint64_t *vertexQueuesEnd_; + // Replaces calls to buffer.size() on the CPU. It's therefore + // the size of the underlying buffer, not the size of the + // Circular buffer. + uint64_t *vertexQueuesBufferSize_; + + /// The number of calls that have been dropped (got a busy signal) + //vector droppedCalls_; + int *droppedCalls_; + + /// The number of received calls + //vector receivedCalls_; + int *receivedCalls_; + + /// Number of servers currently serving calls + //vector busyServers_; + int *busyServers_; + + /// Number of servers. In a PSAP these are the call takers, in Responder nodes + /// they are responder units + //vector numServers_; + int *numServers_; + + /// Number of phone lines available. Only valid for PSAPs and Responders + //vector numTrunks_; + int *numTrunks_; + + /// Holds the calls being served by each server + //vector> servingCall_; + int **servingCallBufferVertexId_; + uint64_t **servingCallBufferTime_; + int **servingCallBufferDuration_; + BGFLOAT **servingCallBufferX_; + BGFLOAT **servingCallBufferY_; + int **servingCallBufferPatience_; + int **servingCallBufferOnSiteTime_; + int **servingCallBufferResponderType_; + + /// The time that the call being served was answered by the server + //vector> answerTime_; + uint64_t **answerTime_; + + /// The countdown until the server is available to take another call + //vector> serverCountdown_; + int **serverCountdown_; + + /// Mapping of the vertex ID to the index in the noise array. Only caller regions + /// need noise for determining if a redial occurs. Caller regions have a value + /// 0 to n where n is the number of caller regions. Non-caller regions have a + /// value of -1. + //vector vertexIdToNoiseIndex_; + int *vertexIdToNoiseIndex_; +}; +#endif // defined(USE_GPU) diff --git a/Simulator/Vertices/NG911/All911Vertices_d.cpp b/Simulator/Vertices/NG911/All911Vertices_d.cpp new file mode 100644 index 000000000..bf8343dc6 --- /dev/null +++ b/Simulator/Vertices/NG911/All911Vertices_d.cpp @@ -0,0 +1,3490 @@ +/** + * @file All911Vertices_d.cpp + * + * @ingroup Simulator/Vertices/NG911 + * + * @brief Specialization of the AllVertices class for the NG911 network + */ + +#include "All911Edges.h" +#include "All911Vertices.h" +#include "Book.h" +#include "GPUModel.h" +#include "Global.h" +#include "InputManager.h" +#include "Layout.h" +#include "Layout911.h" +#include "Simulator.h" +#include +#include +#include //For portable uint64_t formatting in printf +#include + +/// CUDA code for advancing all vertices +/// +__global__ void advance911VerticesDevice( + int totalVertices, int maxEventsPerEpoch, uint64_t stepsPerEpoch, uint64_t simulationStep, + BGFLOAT drivingSpeed, BGFLOAT pi, float redialValues[], BGFLOAT redialProbability, + BGFLOAT *xLocation, BGFLOAT *yLocation, All911VerticesDeviceProperties *allVerticesDevice, + All911EdgesDeviceProperties *allEdgesDevice, EdgeIndexMapDevice *edgeIndexMapDevice); + +/// CUDA code for taking a call from an edge and adding it to a vertex's queue if there is space. +/// +__global__ void maybeTakeCallFromEdge(int totalVertices, uint64_t stepsPerEpoch, + All911VerticesDeviceProperties *allVerticesDevice, + All911EdgesDeviceProperties *allEdgesDevice, + EdgeIndexMapDevice *edgeIndexMapDevice); + +__device__ void advanceCALRVerticesDevice(int vertexId, uint64_t stepsPerEpoch, + uint64_t simulationStep, BGFLOAT redialValue, + BGFLOAT redialProbability, + All911VerticesDeviceProperties *allVerticesDevice, + All911EdgesDeviceProperties *allEdgesDevice, + EdgeIndexMapDevice *edgeIndexMapDevice); + +__device__ void advancePSAPVerticesDevice(int vertexIdx, int maxEventsPerEpoch, + uint64_t stepsPerEpoch, uint64_t simulationStep, + BGFLOAT *xLocation, BGFLOAT *yLocation, + All911VerticesDeviceProperties *allVerticesDevice, + All911EdgesDeviceProperties *allEdgesDevice, + EdgeIndexMapDevice *edgeIndexMapDevice); + +__device__ void advanceRESPVerticesDevice(int vertexIdx, int maxEventsPerEpoch, + uint64_t stepsPerEpoch, uint64_t simulationStep, + BGFLOAT drivingSpeed, BGFLOAT pi, BGFLOAT *xLocation, + BGFLOAT *yLocation, + All911VerticesDeviceProperties *allVerticesDevice, + All911EdgesDeviceProperties *allEdgesDevice, + EdgeIndexMapDevice *edgeIndexMapDevice); + +void All911Vertices::allocVerticesDeviceStruct() +{ + All911VerticesDeviceProperties allVertices; + LOG4CPLUS_DEBUG(vertexLogger_, + "Size of 911 vertice device: " << sizeof(All911VerticesDeviceProperties)); + GPUModel *gpuModel = static_cast(&Simulator::getInstance().getModel()); + void **allVerticesDevice = reinterpret_cast(&(gpuModel->getAllVerticesDevice())); + allocDeviceStruct(allVertices); + HANDLE_ERROR(cudaMalloc(allVerticesDevice, sizeof(All911VerticesDeviceProperties))); + HANDLE_ERROR(cudaMemcpy(*allVerticesDevice, &allVertices, sizeof(All911VerticesDeviceProperties), + cudaMemcpyHostToDevice)); +} + +/// Allocate GPU memories to store all vertices' states. +/// (Helper function of allocVerticesDeviceStruct) +/// @param allVerticesDevice Reference to the All911VerticesDeviceProperties struct. +void All911Vertices::allocDeviceStruct(All911VerticesDeviceProperties &allVerticesDevice) +{ + Simulator &simulator = Simulator::getInstance(); + uint64_t stepsPerEpoch = simulator.getEpochDuration() / simulator.getDeltaT(); + int numberOfVertices = simulator.getTotalVertices(); + int maxEventsPerEpoch = static_cast(Simulator::getInstance().getEpochDuration() + * Simulator::getInstance().getMaxFiringRate()); + + // Layout locations + Layout &layout = simulator.getModel().getLayout(); + Layout911 &layout911 = dynamic_cast(layout); + layout911.xloc_.allocateDeviceMemory(); + layout911.yloc_.allocateDeviceMemory(); + + //int *vertexType_; + HANDLE_ERROR( + cudaMalloc((void **)&allVerticesDevice.vertexType_, numberOfVertices * sizeof(int))); + // Follow pattern in ALLIFNeurons_d.cpp allocDeviceStruct for spikeHistory to alloc + // any 2D arrays + // + //uint64_t **beginTimeHistory_; + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.beginTimeHistory_, + numberOfVertices * sizeof(uint64_t *))); + { + uint64_t *cpuBeginTimeHistory[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR( + cudaMalloc((void **)&cpuBeginTimeHistory[i], maxEventsPerEpoch * sizeof(uint64_t))); + } + HANDLE_ERROR(cudaMemcpy(allVerticesDevice.beginTimeHistory_, cpuBeginTimeHistory, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyHostToDevice)); + } + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.beginTimeHistoryBufferFront_, + numberOfVertices * sizeof(int))); + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.beginTimeHistoryBufferEnd_, + numberOfVertices * sizeof(int))); + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.beginTimeHistoryEpochStart_, + numberOfVertices * sizeof(int))); + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.beginTimeHistoryNumElementsInEpoch_, + numberOfVertices * sizeof(int))); + //uint64_t **answerTimeHistory_; + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.answerTimeHistory_, + numberOfVertices * sizeof(uint64_t *))); + { + uint64_t *cpuAnswerTimeHistory[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR( + cudaMalloc((void **)&cpuAnswerTimeHistory[i], maxEventsPerEpoch * sizeof(uint64_t))); + } + HANDLE_ERROR(cudaMemcpy(allVerticesDevice.answerTimeHistory_, cpuAnswerTimeHistory, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyHostToDevice)); + } + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.answerTimeHistoryBufferFront_, + numberOfVertices * sizeof(int))); + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.answerTimeHistoryBufferEnd_, + numberOfVertices * sizeof(int))); + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.answerTimeHistoryEpochStart_, + numberOfVertices * sizeof(int))); + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.answerTimeHistoryNumElementsInEpoch_, + numberOfVertices * sizeof(int))); + //uint64_t **endTimeHistory_; + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.endTimeHistory_, + numberOfVertices * sizeof(uint64_t *))); + { + uint64_t *cpuEndTimeHistory[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR( + cudaMalloc((void **)&cpuEndTimeHistory[i], maxEventsPerEpoch * sizeof(uint64_t))); + } + HANDLE_ERROR(cudaMemcpy(allVerticesDevice.endTimeHistory_, cpuEndTimeHistory, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyHostToDevice)); + } + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.endTimeHistoryBufferFront_, + numberOfVertices * sizeof(int))); + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.endTimeHistoryBufferEnd_, + numberOfVertices * sizeof(int))); + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.endTimeHistoryEpochStart_, + numberOfVertices * sizeof(int))); + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.endTimeHistoryNumElementsInEpoch_, + numberOfVertices * sizeof(int))); + //uint64_t **wasAbandonedHistory_; + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.wasAbandonedHistory_, + numberOfVertices * sizeof(uint64_t *))); + { + uint64_t *cpuWasAbandonedHistory[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR( + cudaMalloc((void **)&cpuWasAbandonedHistory[i], maxEventsPerEpoch * sizeof(uint64_t))); + } + HANDLE_ERROR(cudaMemcpy(allVerticesDevice.wasAbandonedHistory_, cpuWasAbandonedHistory, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyHostToDevice)); + } + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.wasAbandonedHistoryBufferFront_, + numberOfVertices * sizeof(int))); + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.wasAbandonedHistoryBufferEnd_, + numberOfVertices * sizeof(int))); + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.wasAbandonedHistoryEpochStart_, + numberOfVertices * sizeof(int))); + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.wasAbandonedHistoryNumElementsInEpoch_, + numberOfVertices * sizeof(int))); + //uint64_t **queueLengthHistory_; + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.queueLengthHistory_, + numberOfVertices * sizeof(uint64_t *))); + { + uint64_t *cpuQueueLengthHistory[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR( + cudaMalloc((void **)&cpuQueueLengthHistory[i], stepsPerEpoch * sizeof(uint64_t))); + } + HANDLE_ERROR(cudaMemcpy(allVerticesDevice.queueLengthHistory_, cpuQueueLengthHistory, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyHostToDevice)); + } + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.queueLengthHistoryBufferFront_, + numberOfVertices * sizeof(int))); + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.queueLengthHistoryBufferEnd_, + numberOfVertices * sizeof(int))); + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.queueLengthHistoryEpochStart_, + numberOfVertices * sizeof(int))); + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.queueLengthHistoryNumElementsInEpoch_, + numberOfVertices * sizeof(int))); + //BGFLOAT **utilizationHistory_; + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.utilizationHistory_, + numberOfVertices * sizeof(BGFLOAT *))); + { + BGFLOAT *cpuUtilizationHistory[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR( + cudaMalloc((void **)&cpuUtilizationHistory[i], stepsPerEpoch * sizeof(BGFLOAT))); + } + HANDLE_ERROR(cudaMemcpy(allVerticesDevice.utilizationHistory_, cpuUtilizationHistory, + numberOfVertices * sizeof(BGFLOAT *), cudaMemcpyHostToDevice)); + } + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.utilizationHistoryBufferFront_, + numberOfVertices * sizeof(int))); + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.utilizationHistoryBufferEnd_, + numberOfVertices * sizeof(int))); + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.utilizationHistoryEpochStart_, + numberOfVertices * sizeof(int))); + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.utilizationHistoryNumElementsInEpoch_, + numberOfVertices * sizeof(int))); + //int **vertexQueuesBufferVertexId_; + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.vertexQueuesBufferVertexId_, + numberOfVertices * sizeof(int *))); + { + int *cpuCallId[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaMalloc((void **)&cpuCallId[i], (stepsPerEpoch + 1) * sizeof(int))); + } + HANDLE_ERROR(cudaMemcpy(allVerticesDevice.vertexQueuesBufferVertexId_, cpuCallId, + numberOfVertices * sizeof(int *), cudaMemcpyHostToDevice)); + } + //uint64_t **vertexQueuesBufferTime_; + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.vertexQueuesBufferTime_, + numberOfVertices * sizeof(uint64_t *))); + { + uint64_t *cpuCallTime[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaMalloc((void **)&cpuCallTime[i], (stepsPerEpoch + 1) * sizeof(uint64_t))); + } + HANDLE_ERROR(cudaMemcpy(allVerticesDevice.vertexQueuesBufferTime_, cpuCallTime, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyHostToDevice)); + } + //int **vertexQueuesBufferDuration_; + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.vertexQueuesBufferDuration_, + numberOfVertices * sizeof(int *))); + { + int *cpuCallDuration[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaMalloc((void **)&cpuCallDuration[i], (stepsPerEpoch + 1) * sizeof(int))); + } + HANDLE_ERROR(cudaMemcpy(allVerticesDevice.vertexQueuesBufferDuration_, cpuCallDuration, + numberOfVertices * sizeof(int *), cudaMemcpyHostToDevice)); + } + //BGFLOAT **vertexQueuesBufferX_; + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.vertexQueuesBufferX_, + numberOfVertices * sizeof(BGFLOAT *))); + { + BGFLOAT *cpuCallLocationX[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR( + cudaMalloc((void **)&cpuCallLocationX[i], (stepsPerEpoch + 1) * sizeof(BGFLOAT))); + } + HANDLE_ERROR(cudaMemcpy(allVerticesDevice.vertexQueuesBufferX_, cpuCallLocationX, + numberOfVertices * sizeof(BGFLOAT *), cudaMemcpyHostToDevice)); + } + //BGFLOAT **vertexQueuesBufferY_; + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.vertexQueuesBufferY_, + numberOfVertices * sizeof(BGFLOAT *))); + { + BGFLOAT *cpuCallLocationY[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR( + cudaMalloc((void **)&cpuCallLocationY[i], (stepsPerEpoch + 1) * sizeof(BGFLOAT))); + } + HANDLE_ERROR(cudaMemcpy(allVerticesDevice.vertexQueuesBufferY_, cpuCallLocationY, + numberOfVertices * sizeof(BGFLOAT *), cudaMemcpyHostToDevice)); + } + //int **vertexQueuesBufferPatience_; + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.vertexQueuesBufferPatience_, + numberOfVertices * sizeof(int *))); + { + int *cpuCallPatience[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaMalloc((void **)&cpuCallPatience[i], (stepsPerEpoch + 1) * sizeof(int))); + } + HANDLE_ERROR(cudaMemcpy(allVerticesDevice.vertexQueuesBufferPatience_, cpuCallPatience, + numberOfVertices * sizeof(int *), cudaMemcpyHostToDevice)); + } + //int **vertexQueuesBufferOnSiteTime_; + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.vertexQueuesBufferOnSiteTime_, + numberOfVertices * sizeof(int *))); + { + int *cpuCallOnSiteTime[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR( + cudaMalloc((void **)&cpuCallOnSiteTime[i], (stepsPerEpoch + 1) * sizeof(int))); + } + HANDLE_ERROR(cudaMemcpy(allVerticesDevice.vertexQueuesBufferOnSiteTime_, cpuCallOnSiteTime, + numberOfVertices * sizeof(int *), cudaMemcpyHostToDevice)); + } + //int **vertexQueuesBufferResponderType_; + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.vertexQueuesBufferResponderType_, + numberOfVertices * sizeof(int *))); + { + int *cpuCallResponderType[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR( + cudaMalloc((void **)&cpuCallResponderType[i], (stepsPerEpoch + 1) * sizeof(int))); + } + HANDLE_ERROR(cudaMemcpy(allVerticesDevice.vertexQueuesBufferResponderType_, + cpuCallResponderType, numberOfVertices * sizeof(int *), + cudaMemcpyHostToDevice)); + } + //uint64_t *vertexQueuesFront_; + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.vertexQueuesFront_, + numberOfVertices * sizeof(uint64_t))); + //uint64_t *vertexQueuesEnd_; + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.vertexQueuesEnd_, + numberOfVertices * sizeof(uint64_t))); + //uint64_t *vertexQueuesBufferSize_; + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.vertexQueuesBufferSize_, + numberOfVertices * sizeof(uint64_t))); + //int *droppedCalls_; + HANDLE_ERROR( + cudaMalloc((void **)&allVerticesDevice.droppedCalls_, numberOfVertices * sizeof(int))); + //int *receivedCalls_; + HANDLE_ERROR( + cudaMalloc((void **)&allVerticesDevice.receivedCalls_, numberOfVertices * sizeof(int))); + //int *busyServers_; + HANDLE_ERROR( + cudaMalloc((void **)&allVerticesDevice.busyServers_, numberOfVertices * sizeof(int))); + //int *numServers_; + HANDLE_ERROR( + cudaMalloc((void **)&allVerticesDevice.numServers_, numberOfVertices * sizeof(int))); + //int *numTrunks_; + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.numTrunks_, numberOfVertices * sizeof(int))); + //int **servingCallBufferVertexId_; + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.servingCallBufferVertexId_, + numberOfVertices * sizeof(int *))); + { + int *cpuCallId[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaMalloc((void **)&cpuCallId[i], maxNumberOfServers_ * sizeof(int))); + } + HANDLE_ERROR(cudaMemcpy(allVerticesDevice.servingCallBufferVertexId_, cpuCallId, + numberOfVertices * sizeof(int *), cudaMemcpyHostToDevice)); + } + //uint64_t **servingCallBufferTime_; + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.servingCallBufferTime_, + numberOfVertices * sizeof(uint64_t *))); + { + uint64_t *cpuCallTime[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaMalloc((void **)&cpuCallTime[i], maxNumberOfServers_ * sizeof(uint64_t))); + } + HANDLE_ERROR(cudaMemcpy(allVerticesDevice.servingCallBufferTime_, cpuCallTime, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyHostToDevice)); + } + //int **servingCallBufferDuration_; + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.servingCallBufferDuration_, + numberOfVertices * sizeof(int *))); + { + int *cpuCallDuration[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaMalloc((void **)&cpuCallDuration[i], maxNumberOfServers_ * sizeof(int))); + } + HANDLE_ERROR(cudaMemcpy(allVerticesDevice.servingCallBufferDuration_, cpuCallDuration, + numberOfVertices * sizeof(int *), cudaMemcpyHostToDevice)); + } + //BGFLOAT **servingCallBufferX_; + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.servingCallBufferX_, + numberOfVertices * sizeof(BGFLOAT *))); + { + BGFLOAT *cpuCallLocationX[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR( + cudaMalloc((void **)&cpuCallLocationX[i], maxNumberOfServers_ * sizeof(BGFLOAT))); + } + HANDLE_ERROR(cudaMemcpy(allVerticesDevice.servingCallBufferX_, cpuCallLocationX, + numberOfVertices * sizeof(BGFLOAT *), cudaMemcpyHostToDevice)); + } + //BGFLOAT **servingCallBufferY_; + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.servingCallBufferY_, + numberOfVertices * sizeof(BGFLOAT *))); + { + BGFLOAT *cpuCallLocationY[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR( + cudaMalloc((void **)&cpuCallLocationY[i], maxNumberOfServers_ * sizeof(BGFLOAT))); + } + HANDLE_ERROR(cudaMemcpy(allVerticesDevice.servingCallBufferY_, cpuCallLocationY, + numberOfVertices * sizeof(BGFLOAT *), cudaMemcpyHostToDevice)); + } + //int **servingCallBufferPatience_; + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.servingCallBufferPatience_, + numberOfVertices * sizeof(int *))); + { + int *cpuCallPatience[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaMalloc((void **)&cpuCallPatience[i], maxNumberOfServers_ * sizeof(int))); + } + HANDLE_ERROR(cudaMemcpy(allVerticesDevice.servingCallBufferPatience_, cpuCallPatience, + numberOfVertices * sizeof(int *), cudaMemcpyHostToDevice)); + } + //int **servingCallBufferOnSiteTime_; + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.servingCallBufferOnSiteTime_, + numberOfVertices * sizeof(int *))); + { + int *cpuCallOnSiteTime[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR( + cudaMalloc((void **)&cpuCallOnSiteTime[i], maxNumberOfServers_ * sizeof(int))); + } + HANDLE_ERROR(cudaMemcpy(allVerticesDevice.servingCallBufferOnSiteTime_, cpuCallOnSiteTime, + numberOfVertices * sizeof(int *), cudaMemcpyHostToDevice)); + } + //int **servingCallBufferResponderType_; + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.servingCallBufferResponderType_, + numberOfVertices * sizeof(int *))); + { + int *cpuCallResponderType[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR( + cudaMalloc((void **)&cpuCallResponderType[i], maxNumberOfServers_ * sizeof(int))); + } + HANDLE_ERROR(cudaMemcpy(allVerticesDevice.servingCallBufferResponderType_, + cpuCallResponderType, numberOfVertices * sizeof(int *), + cudaMemcpyHostToDevice)); + } + //uint64_t **answerTime_; + HANDLE_ERROR( + cudaMalloc((void **)&allVerticesDevice.answerTime_, numberOfVertices * sizeof(uint64_t *))); + { + uint64_t *cpuAnswerTime[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR( + cudaMalloc((void **)&cpuAnswerTime[i], maxNumberOfServers_ * sizeof(uint64_t))); + } + HANDLE_ERROR(cudaMemcpy(allVerticesDevice.answerTime_, cpuAnswerTime, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyHostToDevice)); + } + //int **serverCountdown_; + HANDLE_ERROR( + cudaMalloc((void **)&allVerticesDevice.serverCountdown_, numberOfVertices * sizeof(int *))); + { + int *cpuServerCountdown[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR( + cudaMalloc((void **)&cpuServerCountdown[i], maxNumberOfServers_ * sizeof(int))); + } + HANDLE_ERROR(cudaMemcpy(allVerticesDevice.serverCountdown_, cpuServerCountdown, + numberOfVertices * sizeof(int *), cudaMemcpyHostToDevice)); + } + //int *vertexIdToNoiseIndex_; + HANDLE_ERROR(cudaMalloc((void **)&allVerticesDevice.vertexIdToNoiseIndex_, + numberOfVertices * sizeof(int))); +} + +/// Delete GPU memories. +/// +void All911Vertices::deleteVerticesDeviceStruct() +{ + All911VerticesDeviceProperties allVertices; + GPUModel *gpuModel = static_cast(&Simulator::getInstance().getModel()); + void *allVerticesDevice = static_cast(gpuModel->getAllVerticesDevice()); + HANDLE_ERROR(cudaMemcpy(&allVertices, allVerticesDevice, sizeof(All911VerticesDeviceProperties), + cudaMemcpyDeviceToHost)); + deleteDeviceStruct(allVertices); + HANDLE_ERROR(cudaFree(allVerticesDevice)); +} + +/// Delete GPU memories. +/// (Helper function of deleteVerticesDeviceStruct) +/// +/// @param allVerticesDevice GPU address of the All911VerticesDeviceProperties struct. +void All911Vertices::deleteDeviceStruct(All911VerticesDeviceProperties &allVerticesDevice) +{ + Simulator &simulator = Simulator::getInstance(); + int numberOfVertices = simulator.getTotalVertices(); + // Free layout locations + Layout &layout = simulator.getModel().getLayout(); + Layout911 &layout911 = dynamic_cast(layout); + layout911.xloc_.freeDeviceMemory(); + layout911.yloc_.freeDeviceMemory(); + // int *vertexType_; + HANDLE_ERROR(cudaFree(allVerticesDevice.vertexType_)); + // uint64_t **beginTimeHistory_; + { + uint64_t *cpuBeginTimeHistory[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuBeginTimeHistory, allVerticesDevice.beginTimeHistory_, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaFree(cpuBeginTimeHistory[i])); + } + HANDLE_ERROR(cudaFree(allVerticesDevice.beginTimeHistory_)); + } + // int *beginTimeHistoryBufferFront_; + HANDLE_ERROR(cudaFree(allVerticesDevice.beginTimeHistoryBufferFront_)); + // int *beginTimeHistoryBufferEnd_; + HANDLE_ERROR(cudaFree(allVerticesDevice.beginTimeHistoryBufferEnd_)); + // int *beginTimeHistoryEpochStart_; + HANDLE_ERROR(cudaFree(allVerticesDevice.beginTimeHistoryEpochStart_)); + // int *beginTimeHistoryNumElementsInEpoch_; + HANDLE_ERROR(cudaFree(allVerticesDevice.beginTimeHistoryNumElementsInEpoch_)); + // uint64_t **answerTimeHistory_; + { + uint64_t *cpuAnswerTimeHistory[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuAnswerTimeHistory, allVerticesDevice.answerTimeHistory_, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaFree(cpuAnswerTimeHistory[i])); + } + HANDLE_ERROR(cudaFree(allVerticesDevice.answerTimeHistory_)); + } + // int *answerTimeHistoryBufferFront_; + HANDLE_ERROR(cudaFree(allVerticesDevice.answerTimeHistoryBufferFront_)); + // int *answerTimeHistoryBufferEnd_; + HANDLE_ERROR(cudaFree(allVerticesDevice.answerTimeHistoryBufferEnd_)); + // int *answerTimeHistoryEpochStart_; + HANDLE_ERROR(cudaFree(allVerticesDevice.answerTimeHistoryEpochStart_)); + // int *answerTimeHistoryNumElementsInEpoch_; + HANDLE_ERROR(cudaFree(allVerticesDevice.answerTimeHistoryNumElementsInEpoch_)); + // uint64_t **endTimeHistory_; + { + uint64_t *cpuEndTimeHistory[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuEndTimeHistory, allVerticesDevice.endTimeHistory_, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaFree(cpuEndTimeHistory[i])); + } + HANDLE_ERROR(cudaFree(allVerticesDevice.endTimeHistory_)); + } + // int *endTimeHistoryBufferFront_; + HANDLE_ERROR(cudaFree(allVerticesDevice.endTimeHistoryBufferFront_)); + // int *endTimeHistoryBufferEnd_; + HANDLE_ERROR(cudaFree(allVerticesDevice.endTimeHistoryBufferEnd_)); + // int *endTimeHistoryEpochStart_; + HANDLE_ERROR(cudaFree(allVerticesDevice.endTimeHistoryEpochStart_)); + // int *endTimeHistoryNumElementsInEpoch_; + HANDLE_ERROR(cudaFree(allVerticesDevice.endTimeHistoryNumElementsInEpoch_)); + // uint64_t **wasAbandonedHistory_; + { + uint64_t *cpuWasAbandonedHistory[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuWasAbandonedHistory, allVerticesDevice.wasAbandonedHistory_, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaFree(cpuWasAbandonedHistory[i])); + } + HANDLE_ERROR(cudaFree(allVerticesDevice.wasAbandonedHistory_)); + } + // int *wasAbandonedHistoryBufferFront_; + HANDLE_ERROR(cudaFree(allVerticesDevice.wasAbandonedHistoryBufferFront_)); + // int *wasAbandonedHistoryBufferEnd_; + HANDLE_ERROR(cudaFree(allVerticesDevice.wasAbandonedHistoryBufferEnd_)); + // int *wasAbandonedHistoryEpochStart_; + HANDLE_ERROR(cudaFree(allVerticesDevice.wasAbandonedHistoryEpochStart_)); + // int *wasAbandonedHistoryNumElementsInEpoch_; + HANDLE_ERROR(cudaFree(allVerticesDevice.wasAbandonedHistoryNumElementsInEpoch_)); + // uint64_t **queueLengthHistory_; + { + uint64_t *cpuQueueLengthHistory[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuQueueLengthHistory, allVerticesDevice.queueLengthHistory_, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaFree(cpuQueueLengthHistory[i])); + } + HANDLE_ERROR(cudaFree(allVerticesDevice.queueLengthHistory_)); + } + // int *queueLengthHistoryBufferFront_; + HANDLE_ERROR(cudaFree(allVerticesDevice.queueLengthHistoryBufferFront_)); + // int *queueLengthHistoryBufferEnd_; + HANDLE_ERROR(cudaFree(allVerticesDevice.queueLengthHistoryBufferEnd_)); + // int *queueLengthHistoryEpochStart_; + HANDLE_ERROR(cudaFree(allVerticesDevice.queueLengthHistoryEpochStart_)); + // int *queueLengthHistoryNumElementsInEpoch_; + HANDLE_ERROR(cudaFree(allVerticesDevice.queueLengthHistoryNumElementsInEpoch_)); + // BGFLOAT **utilizationHistory_; + { + BGFLOAT *cpuUtilizationHistory[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuUtilizationHistory, allVerticesDevice.utilizationHistory_, + numberOfVertices * sizeof(BGFLOAT *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaFree(cpuUtilizationHistory[i])); + } + HANDLE_ERROR(cudaFree(allVerticesDevice.utilizationHistory_)); + } + // int *utilizationHistoryBufferFront_; + HANDLE_ERROR(cudaFree(allVerticesDevice.utilizationHistoryBufferFront_)); + // int *utilizationHistoryBufferEnd_; + HANDLE_ERROR(cudaFree(allVerticesDevice.utilizationHistoryBufferEnd_)); + // int *utilizationHistoryEpochStart_; + HANDLE_ERROR(cudaFree(allVerticesDevice.utilizationHistoryEpochStart_)); + // int *utilizationHistoryNumElementsInEpoch_; + HANDLE_ERROR(cudaFree(allVerticesDevice.utilizationHistoryNumElementsInEpoch_)); + // int **vertexQueuesBufferVertexId_; + { + int *cpuCallId[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuCallId, allVerticesDevice.vertexQueuesBufferVertexId_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaFree(cpuCallId[i])); + } + HANDLE_ERROR(cudaFree(allVerticesDevice.vertexQueuesBufferVertexId_)); + } + // uint64_t **vertexQueuesBufferTime_; + { + uint64_t *cpuCallTime[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuCallTime, allVerticesDevice.vertexQueuesBufferTime_, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaFree(cpuCallTime[i])); + } + HANDLE_ERROR(cudaFree(allVerticesDevice.vertexQueuesBufferTime_)); + } + // int **vertexQueuesBufferDuration_; + { + int *cpuCallDuration[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuCallDuration, allVerticesDevice.vertexQueuesBufferDuration_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaFree(cpuCallDuration[i])); + } + HANDLE_ERROR(cudaFree(allVerticesDevice.vertexQueuesBufferDuration_)); + } + // BGFLOAT **vertexQueuesBufferX_; + { + BGFLOAT *cpuCallLocationX[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuCallLocationX, allVerticesDevice.vertexQueuesBufferX_, + numberOfVertices * sizeof(BGFLOAT *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaFree(cpuCallLocationX[i])); + } + HANDLE_ERROR(cudaFree(allVerticesDevice.vertexQueuesBufferX_)); + } + // BGFLOAT **vertexQueuesBufferY_; + { + BGFLOAT *cpuCallLocationY[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuCallLocationY, allVerticesDevice.vertexQueuesBufferY_, + numberOfVertices * sizeof(BGFLOAT *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaFree(cpuCallLocationY[i])); + } + HANDLE_ERROR(cudaFree(allVerticesDevice.vertexQueuesBufferY_)); + } + // int **vertexQueuesBufferPatience_; + { + int *cpuCallPatience[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuCallPatience, allVerticesDevice.vertexQueuesBufferPatience_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaFree(cpuCallPatience[i])); + } + HANDLE_ERROR(cudaFree(allVerticesDevice.vertexQueuesBufferPatience_)); + } + // int **vertexQueuesBufferOnSiteTime_; + { + int *cpuCallOnSiteTime[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuCallOnSiteTime, allVerticesDevice.vertexQueuesBufferOnSiteTime_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaFree(cpuCallOnSiteTime[i])); + } + HANDLE_ERROR(cudaFree(allVerticesDevice.vertexQueuesBufferOnSiteTime_)); + } + // int **vertexQueuesBufferResponderType_; + { + int *cpuCallResponderType[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuCallResponderType, + allVerticesDevice.vertexQueuesBufferResponderType_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaFree(cpuCallResponderType[i])); + } + HANDLE_ERROR(cudaFree(allVerticesDevice.vertexQueuesBufferResponderType_)); + } + // uint64_t *vertexQueuesFront_; + HANDLE_ERROR(cudaFree(allVerticesDevice.vertexQueuesFront_)); + // uint64_t *vertexQueuesEnd_; + HANDLE_ERROR(cudaFree(allVerticesDevice.vertexQueuesEnd_)); + // uint64_t *vertexQueuesBufferSize_; + HANDLE_ERROR(cudaFree(allVerticesDevice.vertexQueuesBufferSize_)); + // int *droppedCalls_; + HANDLE_ERROR(cudaFree(allVerticesDevice.droppedCalls_)); + // int *receivedCalls_; + HANDLE_ERROR(cudaFree(allVerticesDevice.receivedCalls_)); + // int *busyServers_; + HANDLE_ERROR(cudaFree(allVerticesDevice.busyServers_)); + // int *numServers_; + HANDLE_ERROR(cudaFree(allVerticesDevice.numServers_)); + // int *numTrunks_; + HANDLE_ERROR(cudaFree(allVerticesDevice.numTrunks_)); + // int **servingCallBufferVertexId_; + { + int *cpuCallId[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuCallId, allVerticesDevice.servingCallBufferVertexId_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaFree(cpuCallId[i])); + } + HANDLE_ERROR(cudaFree(allVerticesDevice.servingCallBufferVertexId_)); + } + // uint64_t **servingCallBufferTime_; + { + uint64_t *cpuCallTime[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuCallTime, allVerticesDevice.servingCallBufferTime_, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaFree(cpuCallTime[i])); + } + HANDLE_ERROR(cudaFree(allVerticesDevice.servingCallBufferTime_)); + } + // int **servingCallBufferDuration_; + { + int *cpuCallDuration[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuCallDuration, allVerticesDevice.servingCallBufferDuration_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaFree(cpuCallDuration[i])); + } + HANDLE_ERROR(cudaFree(allVerticesDevice.servingCallBufferDuration_)); + } + // BGFLOAT **servingCallBufferX_; + { + BGFLOAT *cpuCallLocationX[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuCallLocationX, allVerticesDevice.servingCallBufferX_, + numberOfVertices * sizeof(BGFLOAT *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaFree(cpuCallLocationX[i])); + } + HANDLE_ERROR(cudaFree(allVerticesDevice.servingCallBufferX_)); + } + // BGFLOAT **servingCallBufferY_; + { + BGFLOAT *cpuCallLocationY[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuCallLocationY, allVerticesDevice.servingCallBufferY_, + numberOfVertices * sizeof(BGFLOAT *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaFree(cpuCallLocationY[i])); + } + HANDLE_ERROR(cudaFree(allVerticesDevice.servingCallBufferY_)); + } + // int **servingCallBufferPatience_; + { + int *cpuCallPatience[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuCallPatience, allVerticesDevice.servingCallBufferPatience_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaFree(cpuCallPatience[i])); + } + HANDLE_ERROR(cudaFree(allVerticesDevice.servingCallBufferPatience_)); + } + // int **servingCallBufferOnSiteTime_; + { + int *cpuCallOnSiteTime[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuCallOnSiteTime, allVerticesDevice.servingCallBufferOnSiteTime_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaFree(cpuCallOnSiteTime[i])); + } + HANDLE_ERROR(cudaFree(allVerticesDevice.servingCallBufferOnSiteTime_)); + } + // int **servingCallBufferResponderType_; + { + int *cpuCallResponderType[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuCallResponderType, + allVerticesDevice.servingCallBufferResponderType_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaFree(cpuCallResponderType[i])); + } + HANDLE_ERROR(cudaFree(allVerticesDevice.servingCallBufferResponderType_)); + } + // uint64_t **answerTime_; + { + uint64_t *cpuAnswerTime[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuAnswerTime, allVerticesDevice.answerTime_, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaFree(cpuAnswerTime[i])); + } + HANDLE_ERROR(cudaFree(allVerticesDevice.answerTime_)); + } + // int **serverCountdown_; + { + int *cpuServerCountdown[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuServerCountdown, allVerticesDevice.serverCountdown_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaFree(cpuServerCountdown[i])); + } + HANDLE_ERROR(cudaFree(allVerticesDevice.serverCountdown_)); + } + //int *vertexIdToNoiseIndex_; + HANDLE_ERROR(cudaFree(allVerticesDevice.vertexIdToNoiseIndex_)); +} + +/// @brief Helper function for copying vertex queues to device from CPU. +/// @pre Memory has been allocated for the All911VerticesDeviceProperties struct. Calls +/// are only of type EMS, FIRE, or LAW. +void All911Vertices::copyVertexQueuesToDevice(int numberOfVertices, uint64_t stepsPerEpoch, + All911VerticesDeviceProperties &allVerticesDevice) +{ + // int **vertexQueuesBufferVertexId_; + { + int *callIdCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callIdCpu, allVerticesDevice.vertexQueuesBufferVertexId_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callIdInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callIdInBuffer.resize(stepsPerEpoch + 1); + vector buffer = vertexQueues_[i].getBuffer(); + for (int j = 0; j < buffer.size(); j++) { + callIdInBuffer[j] = buffer[j].vertexId; + } + HANDLE_ERROR(cudaMemcpy(callIdCpu[i], callIdInBuffer.data(), + (stepsPerEpoch + 1) * sizeof(int), cudaMemcpyHostToDevice)); + // clear vector before filling with next vertex's call ids + callIdInBuffer.clear(); + } + } + // uint64_t **vertexQueuesBufferTime_; + { + uint64_t *callTimeCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callTimeCpu, allVerticesDevice.vertexQueuesBufferTime_, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callTimeInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callTimeInBuffer.resize(stepsPerEpoch + 1); + vector buffer = vertexQueues_[i].getBuffer(); + for (int j = 0; j < buffer.size(); j++) { + callTimeInBuffer[j] = buffer[j].time; + } + HANDLE_ERROR(cudaMemcpy(callTimeCpu[i], callTimeInBuffer.data(), + (stepsPerEpoch + 1) * sizeof(uint64_t), cudaMemcpyHostToDevice)); + // clear vector before filling with next vertex's call ids + callTimeInBuffer.clear(); + } + } + // int **vertexQueuesBufferDuration_; + { + int *callDurationCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callDurationCpu, allVerticesDevice.vertexQueuesBufferDuration_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callDurationInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callDurationInBuffer.resize(stepsPerEpoch + 1); + vector buffer = vertexQueues_[i].getBuffer(); + for (int j = 0; j < buffer.size(); j++) { + callDurationInBuffer[j] = buffer[j].duration; + } + HANDLE_ERROR(cudaMemcpy(callDurationCpu[i], callDurationInBuffer.data(), + (stepsPerEpoch + 1) * sizeof(int), cudaMemcpyHostToDevice)); + // clear vector before filling with next vertex's call ids + callDurationInBuffer.clear(); + } + } + // BGFLOAT **vertexQueuesBufferX_; + { + BGFLOAT *callLocationXCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callLocationXCpu, allVerticesDevice.vertexQueuesBufferX_, + numberOfVertices * sizeof(BGFLOAT *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callLocationXInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callLocationXInBuffer.resize(stepsPerEpoch + 1); + vector buffer = vertexQueues_[i].getBuffer(); + for (int j = 0; j < buffer.size(); j++) { + callLocationXInBuffer[j] = buffer[j].x; + } + HANDLE_ERROR(cudaMemcpy(callLocationXCpu[i], callLocationXInBuffer.data(), + (stepsPerEpoch + 1) * sizeof(BGFLOAT), cudaMemcpyHostToDevice)); + // clear vector before filling with next vertex's call ids + callLocationXInBuffer.clear(); + } + } + // BGFLOAT **vertexQueuesBufferY_; + { + BGFLOAT *callLocationYCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callLocationYCpu, allVerticesDevice.vertexQueuesBufferY_, + numberOfVertices * sizeof(BGFLOAT *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callLocationYInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callLocationYInBuffer.resize(stepsPerEpoch + 1); + vector buffer = vertexQueues_[i].getBuffer(); + for (int j = 0; j < buffer.size(); j++) { + callLocationYInBuffer[j] = buffer[j].y; + } + HANDLE_ERROR(cudaMemcpy(callLocationYCpu[i], callLocationYInBuffer.data(), + (stepsPerEpoch + 1) * sizeof(BGFLOAT), cudaMemcpyHostToDevice)); + // clear vector before filling with next vertex's call ids + callLocationYInBuffer.clear(); + } + } + // int **vertexQueuesBufferPatience_; + { + int *callPatienceCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callPatienceCpu, allVerticesDevice.vertexQueuesBufferPatience_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callPatienceInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callPatienceInBuffer.resize(stepsPerEpoch + 1); + vector buffer = vertexQueues_[i].getBuffer(); + for (int j = 0; j < buffer.size(); j++) { + callPatienceInBuffer[j] = buffer[j].patience; + } + HANDLE_ERROR(cudaMemcpy(callPatienceCpu[i], callPatienceInBuffer.data(), + (stepsPerEpoch + 1) * sizeof(int), cudaMemcpyHostToDevice)); + // clear vector before filling with next vertex's call ids + callPatienceInBuffer.clear(); + } + } + // int **vertexQueuesBufferOnSiteTime_; + { + int *callOnSiteTimeCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callOnSiteTimeCpu, allVerticesDevice.vertexQueuesBufferOnSiteTime_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callOnSiteTimeInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callOnSiteTimeInBuffer.resize(stepsPerEpoch + 1); + vector buffer = vertexQueues_[i].getBuffer(); + for (int j = 0; j < buffer.size(); j++) { + callOnSiteTimeInBuffer[j] = buffer[j].onSiteTime; + } + HANDLE_ERROR(cudaMemcpy(callOnSiteTimeCpu[i], callOnSiteTimeInBuffer.data(), + (stepsPerEpoch + 1) * sizeof(int), cudaMemcpyHostToDevice)); + // clear vector before filling with next vertex's call ids + callOnSiteTimeInBuffer.clear(); + } + } + // int **vertexQueuesBufferResponderType_; + { + int *callResponderTypeCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callResponderTypeCpu, + allVerticesDevice.vertexQueuesBufferResponderType_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callResponderTypeInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callResponderTypeInBuffer.resize(stepsPerEpoch + 1); + vector buffer = vertexQueues_[i].getBuffer(); + for (int j = 0; j < buffer.size(); j++) { + std::string typeInBuffer = buffer[j].type; + if (typeInBuffer == "EMS") { + callResponderTypeInBuffer[j] = 5; + } else if (typeInBuffer == "Fire") { + callResponderTypeInBuffer[j] = 6; + } else if (typeInBuffer == "Law") { + callResponderTypeInBuffer[j] = 7; + } + } + HANDLE_ERROR(cudaMemcpy(callResponderTypeCpu[i], callResponderTypeInBuffer.data(), + (stepsPerEpoch + 1) * sizeof(int), cudaMemcpyHostToDevice)); + // clear vector before filling with next vertex's call ids + callResponderTypeInBuffer.clear(); + } + } + // uint64_t *vertexQueuesFront_; + { + uint64_t queueFrontCpu[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + queueFrontCpu[i] = vertexQueues_[i].getFrontIndex(); + } + HANDLE_ERROR(cudaMemcpy(allVerticesDevice.vertexQueuesFront_, queueFrontCpu, + numberOfVertices * sizeof(uint64_t), cudaMemcpyHostToDevice)); + } + // uint64_t *vertexQueuesEnd_; + { + uint64_t queueEndCpu[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + queueEndCpu[i] = vertexQueues_[i].getEndIndex(); + } + HANDLE_ERROR(cudaMemcpy(allVerticesDevice.vertexQueuesEnd_, queueEndCpu, + numberOfVertices * sizeof(uint64_t), cudaMemcpyHostToDevice)); + } + // uint64_t *vertexQueuesBufferSize_; + { + uint64_t queueSizeCpu[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + queueSizeCpu[i] = vertexQueues_[i].getBuffer().size(); + } + HANDLE_ERROR(cudaMemcpy(allVerticesDevice.vertexQueuesBufferSize_, queueSizeCpu, + numberOfVertices * sizeof(uint64_t), cudaMemcpyHostToDevice)); + } +} + +/// @brief Helper function for copying serving calls from CPU. +/// @pre Memory has been allocated for the All911VerticesDeviceProperties struct. Calls +/// are only of type EMS, FIRE, or LAW. +void All911Vertices::copyServingCallToDevice(int numberOfVertices, + All911VerticesDeviceProperties &allVerticesDevice) +{ + // Logic is similar to copyVertexQueuesToDevice but we use max number of servers + // for the inner vector dimension + // + // int **servingCallBufferVertexId_; + { + int *callIdCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callIdCpu, allVerticesDevice.servingCallBufferVertexId_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callIdInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callIdInBuffer.resize(maxNumberOfServers_); + vector buffer = servingCall_[i]; + for (int j = 0; j < buffer.size(); j++) { + callIdInBuffer[j] = buffer[j].vertexId; + } + HANDLE_ERROR(cudaMemcpy(callIdCpu[i], callIdInBuffer.data(), + maxNumberOfServers_ * sizeof(int), cudaMemcpyHostToDevice)); + // clear vector before filling with next vertex's call ids + callIdInBuffer.clear(); + } + } + // uint64_t **servingCallBufferTime_; + { + uint64_t *callTimeCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callTimeCpu, allVerticesDevice.servingCallBufferTime_, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callTimeInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callTimeInBuffer.resize(maxNumberOfServers_); + vector buffer = servingCall_[i]; + for (int j = 0; j < buffer.size(); j++) { + callTimeInBuffer[j] = buffer[j].time; + } + HANDLE_ERROR(cudaMemcpy(callTimeCpu[i], callTimeInBuffer.data(), + maxNumberOfServers_ * sizeof(uint64_t), cudaMemcpyHostToDevice)); + // clear vector before filling with next vertex's call ids + callTimeInBuffer.clear(); + } + } + // int **servingCallBufferDuration_; + { + int *callDurationCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callDurationCpu, allVerticesDevice.servingCallBufferDuration_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callDurationInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callDurationInBuffer.resize(maxNumberOfServers_); + vector buffer = servingCall_[i]; + for (int j = 0; j < buffer.size(); j++) { + callDurationInBuffer[j] = buffer[j].duration; + } + HANDLE_ERROR(cudaMemcpy(callDurationCpu[i], callDurationInBuffer.data(), + maxNumberOfServers_ * sizeof(int), cudaMemcpyHostToDevice)); + // clear vector before filling with next vertex's call ids + callDurationInBuffer.clear(); + } + } + // BGFLOAT **servingCallBufferX_; + { + BGFLOAT *callLocationXCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callLocationXCpu, allVerticesDevice.servingCallBufferX_, + numberOfVertices * sizeof(BGFLOAT *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callLocationXInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callLocationXInBuffer.resize(maxNumberOfServers_); + vector buffer = servingCall_[i]; + for (int j = 0; j < buffer.size(); j++) { + callLocationXInBuffer[j] = buffer[j].x; + } + HANDLE_ERROR(cudaMemcpy(callLocationXCpu[i], callLocationXInBuffer.data(), + maxNumberOfServers_ * sizeof(BGFLOAT), cudaMemcpyHostToDevice)); + // clear vector before filling with next vertex's call ids + callLocationXInBuffer.clear(); + } + } + // BGFLOAT **servingCallBufferY_; + { + BGFLOAT *callLocationYCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callLocationYCpu, allVerticesDevice.servingCallBufferY_, + numberOfVertices * sizeof(BGFLOAT *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callLocationYInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callLocationYInBuffer.resize(maxNumberOfServers_); + vector buffer = servingCall_[i]; + for (int j = 0; j < buffer.size(); j++) { + callLocationYInBuffer[j] = buffer[j].y; + } + HANDLE_ERROR(cudaMemcpy(callLocationYCpu[i], callLocationYInBuffer.data(), + maxNumberOfServers_ * sizeof(BGFLOAT), cudaMemcpyHostToDevice)); + // clear vector before filling with next vertex's call ids + callLocationYInBuffer.clear(); + } + } + // int **servingCallBufferPatience_; + { + int *callPatienceCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callPatienceCpu, allVerticesDevice.servingCallBufferPatience_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callPatienceInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callPatienceInBuffer.resize(maxNumberOfServers_); + vector buffer = servingCall_[i]; + for (int j = 0; j < buffer.size(); j++) { + callPatienceInBuffer[j] = buffer[j].patience; + } + HANDLE_ERROR(cudaMemcpy(callPatienceCpu[i], callPatienceInBuffer.data(), + maxNumberOfServers_ * sizeof(int), cudaMemcpyHostToDevice)); + // clear vector before filling with next vertex's call ids + callPatienceInBuffer.clear(); + } + } + // int **servingCallBufferOnSiteTime_; + { + int *callOnSiteTimeCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callOnSiteTimeCpu, allVerticesDevice.servingCallBufferOnSiteTime_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callOnSiteTimeInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callOnSiteTimeInBuffer.resize(maxNumberOfServers_); + vector buffer = servingCall_[i]; + for (int j = 0; j < buffer.size(); j++) { + callOnSiteTimeInBuffer[j] = buffer[j].onSiteTime; + } + HANDLE_ERROR(cudaMemcpy(callOnSiteTimeCpu[i], callOnSiteTimeInBuffer.data(), + maxNumberOfServers_ * sizeof(int), cudaMemcpyHostToDevice)); + // clear vector before filling with next vertex's call ids + callOnSiteTimeInBuffer.clear(); + } + } + // int **servingCallBufferResponderType_; + { + int *callResponderTypeCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callResponderTypeCpu, + allVerticesDevice.servingCallBufferResponderType_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callResponderTypeInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callResponderTypeInBuffer.resize(maxNumberOfServers_); + vector buffer = servingCall_[i]; + for (int j = 0; j < buffer.size(); j++) { + std::string typeInBuffer = buffer[j].type; + if (typeInBuffer == "EMS") { + callResponderTypeInBuffer[j] = 5; + } else if (typeInBuffer == "Fire") { + callResponderTypeInBuffer[j] = 6; + } else if (typeInBuffer == "Law") { + callResponderTypeInBuffer[j] = 7; + } + } + HANDLE_ERROR(cudaMemcpy(callResponderTypeCpu[i], callResponderTypeInBuffer.data(), + maxNumberOfServers_ * sizeof(int), cudaMemcpyHostToDevice)); + // clear vector before filling with next vertex's call ids + callResponderTypeInBuffer.clear(); + } + } +} + +/// Copy all vertex data from host to device. +void All911Vertices::copyToDevice() +{ + LOG4CPLUS_DEBUG(vertexLogger_, "Copying All911Vertices to device"); + All911VerticesDeviceProperties allVertices; + Simulator &simulator = Simulator::getInstance(); + GPUModel *gpuModel = static_cast(&(simulator.getModel())); + void *deviceAddress = static_cast(gpuModel->getAllVerticesDevice()); + HANDLE_ERROR(cudaMemcpy(&allVertices, deviceAddress, sizeof(All911VerticesDeviceProperties), + cudaMemcpyDeviceToHost)); + + uint64_t stepsPerEpoch = simulator.getEpochDuration() / simulator.getDeltaT(); + int maxEventsPerEpoch = static_cast(Simulator::getInstance().getEpochDuration() + * Simulator::getInstance().getMaxFiringRate()); + int numberOfVertices = simulator.getTotalVertices(); + + // Copy layout locations + Layout &layout = simulator.getModel().getLayout(); + Layout911 &layout911 = dynamic_cast(layout); + layout911.xloc_.copyToDevice(); + layout911.yloc_.copyToDevice(); + // int *vertexType_; + HANDLE_ERROR(cudaMemcpy(allVertices.vertexType_, vertexType_.data(), + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + // uint64_t **beginTimeHistory_; + { + uint64_t *cpuBeginTimeHistory[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuBeginTimeHistory, allVertices.beginTimeHistory_, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaMemcpy(cpuBeginTimeHistory[i], beginTimeHistory_[i].data(), + maxEventsPerEpoch * sizeof(uint64_t), cudaMemcpyHostToDevice)); + } + } + // int *beginTimeHistoryBufferFront_; + { + int cpuQueueFront[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + cpuQueueFront[i] = beginTimeHistory_[i].getBufferFront(); + } + HANDLE_ERROR(cudaMemcpy(allVertices.beginTimeHistoryBufferFront_, cpuQueueFront, + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + } + // int *beginTimeHistoryBufferEnd_; + { + int cpuQueueEnd[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + cpuQueueEnd[i] = beginTimeHistory_[i].getBufferEnd(); + } + HANDLE_ERROR(cudaMemcpy(allVertices.beginTimeHistoryBufferEnd_, cpuQueueEnd, + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + } + // int *beginTimeHistoryEpochStart_; + { + int cpuEpochStart[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + cpuEpochStart[i] = beginTimeHistory_[i].getEpochStart(); + } + HANDLE_ERROR(cudaMemcpy(allVertices.beginTimeHistoryEpochStart_, cpuEpochStart, + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + } + // int *beginTimeHistoryNumElementsInEpoch_; + { + int cpuElementsInEpoch[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + cpuElementsInEpoch[i] = beginTimeHistory_[i].getNumElementsInEpoch(); + } + HANDLE_ERROR(cudaMemcpy(allVertices.beginTimeHistoryNumElementsInEpoch_, cpuElementsInEpoch, + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + } + // uint64_t **answerTimeHistory_; + { + uint64_t *cpuAnswerTimeHistory[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuAnswerTimeHistory, allVertices.answerTimeHistory_, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaMemcpy(cpuAnswerTimeHistory[i], answerTimeHistory_[i].data(), + maxEventsPerEpoch * sizeof(uint64_t), cudaMemcpyHostToDevice)); + } + } + // int *answerTimeHistoryBufferFront_; + { + int cpuQueueFront[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + cpuQueueFront[i] = answerTimeHistory_[i].getBufferFront(); + } + HANDLE_ERROR(cudaMemcpy(allVertices.answerTimeHistoryBufferFront_, cpuQueueFront, + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + } + // int *answerTimeHistoryBufferEnd_; + { + int cpuQueueEnd[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + cpuQueueEnd[i] = answerTimeHistory_[i].getBufferEnd(); + } + HANDLE_ERROR(cudaMemcpy(allVertices.answerTimeHistoryBufferEnd_, cpuQueueEnd, + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + } + // int *answerTimeHistoryEpochStart_; + { + int cpuEpochStart[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + cpuEpochStart[i] = answerTimeHistory_[i].getEpochStart(); + } + HANDLE_ERROR(cudaMemcpy(allVertices.answerTimeHistoryEpochStart_, cpuEpochStart, + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + } + // int *answerTimeHistoryNumElementsInEpoch_; + { + int cpuElementsInEpoch[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + cpuElementsInEpoch[i] = answerTimeHistory_[i].getNumElementsInEpoch(); + } + HANDLE_ERROR(cudaMemcpy(allVertices.answerTimeHistoryNumElementsInEpoch_, cpuElementsInEpoch, + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + } + // uint64_t **endTimeHistory_; + { + uint64_t *cpuEndTimeHistory[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuEndTimeHistory, allVertices.endTimeHistory_, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaMemcpy(cpuEndTimeHistory[i], endTimeHistory_[i].data(), + maxEventsPerEpoch * sizeof(uint64_t), cudaMemcpyHostToDevice)); + } + } + // int *endTimeHistoryBufferFront_; + { + int cpuQueueFront[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + cpuQueueFront[i] = endTimeHistory_[i].getBufferFront(); + } + HANDLE_ERROR(cudaMemcpy(allVertices.endTimeHistoryBufferFront_, cpuQueueFront, + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + } + // int *endTimeHistoryBufferEnd_; + { + int cpuQueueEnd[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + cpuQueueEnd[i] = endTimeHistory_[i].getBufferEnd(); + } + HANDLE_ERROR(cudaMemcpy(allVertices.endTimeHistoryBufferEnd_, cpuQueueEnd, + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + } + // int *endTimeHistoryEpochStart_; + { + int cpuEpochStart[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + cpuEpochStart[i] = endTimeHistory_[i].getEpochStart(); + } + HANDLE_ERROR(cudaMemcpy(allVertices.endTimeHistoryEpochStart_, cpuEpochStart, + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + } + // int *endTimeHistoryNumElementsInEpoch_; + { + int cpuElementsInEpoch[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + cpuElementsInEpoch[i] = endTimeHistory_[i].getNumElementsInEpoch(); + } + HANDLE_ERROR(cudaMemcpy(allVertices.endTimeHistoryNumElementsInEpoch_, cpuElementsInEpoch, + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + } + // uint64_t **wasAbandonedHistory_; + { + uint64_t *cpuWasAbandonedHistory[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuWasAbandonedHistory, allVertices.wasAbandonedHistory_, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaMemcpy(cpuWasAbandonedHistory[i], wasAbandonedHistory_[i].data(), + maxEventsPerEpoch * sizeof(uint64_t), cudaMemcpyHostToDevice)); + } + } + // int *wasAbandonedHistoryBufferFront_; + { + int cpuQueueFront[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + cpuQueueFront[i] = wasAbandonedHistory_[i].getBufferFront(); + } + HANDLE_ERROR(cudaMemcpy(allVertices.wasAbandonedHistoryBufferFront_, cpuQueueFront, + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + } + // int *wasAbandonedHistoryBufferEnd_; + { + int cpuQueueEnd[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + cpuQueueEnd[i] = wasAbandonedHistory_[i].getBufferEnd(); + } + HANDLE_ERROR(cudaMemcpy(allVertices.wasAbandonedHistoryBufferEnd_, cpuQueueEnd, + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + } + // int *wasAbandonedHistoryEpochStart_; + { + int cpuEpochStart[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + cpuEpochStart[i] = wasAbandonedHistory_[i].getEpochStart(); + } + HANDLE_ERROR(cudaMemcpy(allVertices.wasAbandonedHistoryEpochStart_, cpuEpochStart, + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + } + // int *wasAbandonedHistoryNumElementsInEpoch_; + { + int cpuElementsInEpoch[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + cpuElementsInEpoch[i] = wasAbandonedHistory_[i].getNumElementsInEpoch(); + } + HANDLE_ERROR(cudaMemcpy(allVertices.wasAbandonedHistoryNumElementsInEpoch_, + cpuElementsInEpoch, numberOfVertices * sizeof(int), + cudaMemcpyHostToDevice)); + } + // uint64_t **queueLengthHistory_; + { + uint64_t *cpuQueueLengthHistory[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuQueueLengthHistory, allVertices.queueLengthHistory_, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaMemcpy(cpuQueueLengthHistory[i], queueLengthHistory_[i].data(), + stepsPerEpoch * sizeof(uint64_t), cudaMemcpyHostToDevice)); + } + } + // int *queueLengthHistoryBufferFront_; + { + int cpuQueueFront[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + cpuQueueFront[i] = queueLengthHistory_[i].getBufferFront(); + } + HANDLE_ERROR(cudaMemcpy(allVertices.queueLengthHistoryBufferFront_, cpuQueueFront, + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + } + // int *queueLengthHistoryBufferEnd_; + { + int cpuQueueEnd[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + cpuQueueEnd[i] = queueLengthHistory_[i].getBufferEnd(); + } + HANDLE_ERROR(cudaMemcpy(allVertices.queueLengthHistoryBufferEnd_, cpuQueueEnd, + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + } + // int *queueLengthHistoryEpochStart_; + { + int cpuEpochStart[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + cpuEpochStart[i] = queueLengthHistory_[i].getEpochStart(); + } + HANDLE_ERROR(cudaMemcpy(allVertices.queueLengthHistoryEpochStart_, cpuEpochStart, + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + } + // int *queueLengthHistoryNumElementsInEpoch_; + { + int cpuElementsInEpoch[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + cpuElementsInEpoch[i] = queueLengthHistory_[i].getNumElementsInEpoch(); + } + HANDLE_ERROR(cudaMemcpy(allVertices.queueLengthHistoryNumElementsInEpoch_, cpuElementsInEpoch, + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + } + // BGFLOAT **utilizationHistory_; + { + BGFLOAT *cpuUtilizationHistory[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuUtilizationHistory, allVertices.utilizationHistory_, + numberOfVertices * sizeof(BGFLOAT *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaMemcpy(cpuUtilizationHistory[i], utilizationHistory_[i].data(), + stepsPerEpoch * sizeof(BGFLOAT), cudaMemcpyHostToDevice)); + } + } + // int *utilizationHistoryBufferFront_; + { + int cpuQueueFront[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + cpuQueueFront[i] = utilizationHistory_[i].getBufferFront(); + } + HANDLE_ERROR(cudaMemcpy(allVertices.utilizationHistoryBufferFront_, cpuQueueFront, + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + } + // int *utilizationHistoryBufferEnd_; + { + int cpuQueueEnd[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + cpuQueueEnd[i] = utilizationHistory_[i].getBufferEnd(); + } + HANDLE_ERROR(cudaMemcpy(allVertices.utilizationHistoryBufferEnd_, cpuQueueEnd, + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + } + // int *utilizationHistoryEpochStart_; + { + int cpuEpochStart[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + cpuEpochStart[i] = utilizationHistory_[i].getEpochStart(); + } + HANDLE_ERROR(cudaMemcpy(allVertices.utilizationHistoryEpochStart_, cpuEpochStart, + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + } + // int *utilizationHistoryNumElementsInEpoch_; + { + int cpuElementsInEpoch[numberOfVertices]; + for (int i = 0; i < numberOfVertices; i++) { + cpuElementsInEpoch[i] = utilizationHistory_[i].getNumElementsInEpoch(); + } + HANDLE_ERROR(cudaMemcpy(allVertices.utilizationHistoryNumElementsInEpoch_, cpuElementsInEpoch, + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + } + // int **vertexQueuesBufferVertexId_; + // uint64_t **vertexQueuesBufferTime_; + // int **vertexQueuesBufferDuration_; + // BGFLOAT **vertexQueuesBufferX_; + // BGFLOAT **vertexQueuesBufferY_; + // int **vertexQueuesBufferPatience_; + // int **vertexQueuesBufferOnSiteTime_; + // int **vertexQueuesBufferResponderType_; + // uint64_t *vertexQueuesFront_; + // uint64_t *vertexQueuesEnd_; + copyVertexQueuesToDevice(numberOfVertices, stepsPerEpoch, allVertices); + // int *droppedCalls_; + HANDLE_ERROR(cudaMemcpy(allVertices.droppedCalls_, droppedCalls_.data(), + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + // int *receivedCalls_; + HANDLE_ERROR(cudaMemcpy(allVertices.receivedCalls_, receivedCalls_.data(), + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + // int *busyServers_; + HANDLE_ERROR(cudaMemcpy(allVertices.busyServers_, busyServers_.data(), + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + // int *numServers_; + HANDLE_ERROR(cudaMemcpy(allVertices.numServers_, numServers_.data(), + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + // int *numTrunks_; + HANDLE_ERROR(cudaMemcpy(allVertices.numTrunks_, numTrunks_.data(), + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + // int **servingCallBufferVertexId_; + // uint64_t **servingCallBufferTime_; + // int **servingCallBufferDuration_; + // BGFLOAT **servingCallBufferX_; + // BGFLOAT **servingCallBufferY_; + // int **servingCallBufferPatience_; + // int **servingCallBufferOnSiteTime_; + // int **servingCallBufferResponderType_; + copyServingCallToDevice(numberOfVertices, allVertices); + // uint64_t **answerTime_; + { + uint64_t *cpuAnswerTime[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuAnswerTime, allVertices.answerTime_, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaMemcpy(cpuAnswerTime[i], answerTime_[i].data(), + maxNumberOfServers_ * sizeof(uint64_t), cudaMemcpyHostToDevice)); + } + } + // int **serverCountdown_; + { + int *cpuServerCountdown[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuServerCountdown, allVertices.serverCountdown_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaMemcpy(cpuServerCountdown[i], serverCountdown_[i].data(), + maxNumberOfServers_ * sizeof(int), cudaMemcpyHostToDevice)); + } + } + // int *vertexIdToNoiseIndex_; + HANDLE_ERROR(cudaMemcpy(allVertices.vertexIdToNoiseIndex_, vertexIdToNoiseIndex_.data(), + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); +} + +/// @brief Helper function for copying vertex queues from device to CPU. +/// @pre Memory has been allocated for the All911VerticesDeviceProperties struct. Calls +/// are only of type EMS, FIRE, or LAW. +void All911Vertices::copyVertexQueuesFromDevice(int numberOfVertices, uint64_t stepsPerEpoch, + All911VerticesDeviceProperties &allVerticesDevice) +{ + // TODO: Review implementation with Prof Stiber + // int **vertexQueuesBufferVertexId_; + { + int *callIdCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callIdCpu, allVerticesDevice.vertexQueuesBufferVertexId_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callIdInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + // Make sure internal buffer can hold all device values + callIdInBuffer.resize(stepsPerEpoch + 1); + HANDLE_ERROR(cudaMemcpy(callIdInBuffer.data(), callIdCpu[i], + (stepsPerEpoch + 1) * sizeof(int), cudaMemcpyDeviceToHost)); + vector buffer = vertexQueues_[i].getBuffer(); + // Only copy over the number of IDs that we have on the CPU. + for (int j = 0; j < buffer.size(); j++) { + buffer[j].vertexId = callIdInBuffer[j]; + } + // clear vector before filling with next vertex's call IDs + callIdInBuffer.clear(); + } + } + // uint64_t **vertexQueuesBufferTime_; + { + uint64_t *callTimeCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callTimeCpu, allVerticesDevice.vertexQueuesBufferTime_, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callTimeInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callTimeInBuffer.resize(stepsPerEpoch + 1); + HANDLE_ERROR(cudaMemcpy(callTimeInBuffer.data(), callTimeCpu[i], + (stepsPerEpoch + 1) * sizeof(uint64_t), cudaMemcpyDeviceToHost)); + vector buffer = vertexQueues_[i].getBuffer(); + for (int j = 0; j < buffer.size(); j++) { + buffer[j].time = callTimeInBuffer[j]; + } + // clear vector before filling with next vertex's call ids + callTimeInBuffer.clear(); + } + } + // int **vertexQueuesBufferDuration_; + { + int *callDurationCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callDurationCpu, allVerticesDevice.vertexQueuesBufferDuration_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callDurationInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callDurationInBuffer.resize(stepsPerEpoch + 1); + HANDLE_ERROR(cudaMemcpy(callDurationInBuffer.data(), callDurationCpu[i], + (stepsPerEpoch + 1) * sizeof(int), cudaMemcpyDeviceToHost)); + vector buffer = vertexQueues_[i].getBuffer(); + for (int j = 0; j < buffer.size(); j++) { + buffer[j].duration = callDurationInBuffer[j]; + } + // clear vector before filling with next vertex's call ids + callDurationInBuffer.clear(); + } + } + // BGFLOAT **vertexQueuesBufferX_; + { + BGFLOAT *callLocationXCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callLocationXCpu, allVerticesDevice.vertexQueuesBufferX_, + numberOfVertices * sizeof(BGFLOAT *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callLocationXInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callLocationXInBuffer.resize(stepsPerEpoch + 1); + HANDLE_ERROR(cudaMemcpy(callLocationXInBuffer.data(), callLocationXCpu[i], + (stepsPerEpoch + 1) * sizeof(BGFLOAT), cudaMemcpyDeviceToHost)); + vector buffer = vertexQueues_[i].getBuffer(); + for (int j = 0; j < buffer.size(); j++) { + buffer[j].x = callLocationXInBuffer[j]; + } + // clear vector before filling with next vertex's call ids + callLocationXInBuffer.clear(); + } + } + // BGFLOAT **vertexQueuesBufferY_; + { + BGFLOAT *callLocationYCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callLocationYCpu, allVerticesDevice.vertexQueuesBufferY_, + numberOfVertices * sizeof(BGFLOAT *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callLocationYInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callLocationYInBuffer.resize(stepsPerEpoch + 1); + HANDLE_ERROR(cudaMemcpy(callLocationYInBuffer.data(), callLocationYCpu[i], + (stepsPerEpoch + 1) * sizeof(BGFLOAT), cudaMemcpyDeviceToHost)); + vector buffer = vertexQueues_[i].getBuffer(); + for (int j = 0; j < buffer.size(); j++) { + buffer[j].y = callLocationYInBuffer[j]; + } + // clear vector before filling with next vertex's call ids + callLocationYInBuffer.clear(); + } + } + // int **vertexQueuesBufferPatience_; + { + int *callPatienceCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callPatienceCpu, allVerticesDevice.vertexQueuesBufferPatience_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callPatienceInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callPatienceInBuffer.resize(stepsPerEpoch + 1); + HANDLE_ERROR(cudaMemcpy(callPatienceInBuffer.data(), callPatienceCpu[i], + (stepsPerEpoch + 1) * sizeof(int), cudaMemcpyDeviceToHost)); + vector buffer = vertexQueues_[i].getBuffer(); + for (int j = 0; j < buffer.size(); j++) { + buffer[j].patience = callPatienceInBuffer[j]; + } + // clear vector before filling with next vertex's call ids + callPatienceInBuffer.clear(); + } + } + // int **vertexQueuesBufferOnSiteTime_; + { + int *callOnSiteTimeCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callOnSiteTimeCpu, allVerticesDevice.vertexQueuesBufferOnSiteTime_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callOnSiteTimeInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callOnSiteTimeInBuffer.resize(stepsPerEpoch + 1); + HANDLE_ERROR(cudaMemcpy(callOnSiteTimeInBuffer.data(), callOnSiteTimeCpu[i], + (stepsPerEpoch + 1) * sizeof(int), cudaMemcpyDeviceToHost)); + vector buffer = vertexQueues_[i].getBuffer(); + for (int j = 0; j < buffer.size(); j++) { + buffer[j].onSiteTime = callOnSiteTimeInBuffer[j]; + } + // clear vector before filling with next vertex's call ids + callOnSiteTimeInBuffer.clear(); + } + } + // int **vertexQueuesBufferResponderType_; + { + int *callResponderTypeCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callResponderTypeCpu, + allVerticesDevice.vertexQueuesBufferResponderType_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callResponderTypeInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callResponderTypeInBuffer.resize(stepsPerEpoch + 1); + HANDLE_ERROR(cudaMemcpy(callResponderTypeInBuffer.data(), callResponderTypeCpu[i], + (stepsPerEpoch + 1) * sizeof(int), cudaMemcpyDeviceToHost)); + vector buffer = vertexQueues_[i].getBuffer(); + for (int j = 0; j < buffer.size(); j++) { + if (callResponderTypeInBuffer[j] == 5) { + buffer[j].type = "EMS"; + } else if (callResponderTypeInBuffer[j] == 6) { + buffer[j].type = "Fire"; + } else if (callResponderTypeInBuffer[j] == 7) { + buffer[j].type = "Law"; + } + } + // clear vector before filling with next vertex's call ids + callResponderTypeInBuffer.clear(); + } + } + // uint64_t *vertexQueuesFront_; + { + uint64_t queueFrontCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(queueFrontCpu, allVerticesDevice.vertexQueuesFront_, + numberOfVertices * sizeof(uint64_t), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + vertexQueues_[i].setFrontIndex(queueFrontCpu[i]); + } + } + // uint64_t *vertexQueuesEnd_; + { + uint64_t queueEndCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(queueEndCpu, allVerticesDevice.vertexQueuesEnd_, + numberOfVertices * sizeof(uint64_t), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + vertexQueues_[i].setEndIndex(queueEndCpu[i]); + } + } + // uint64_t *vertexQueuesBufferSize_; + { + uint64_t queueSizeCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(queueSizeCpu, allVerticesDevice.vertexQueuesBufferSize_, + numberOfVertices * sizeof(uint64_t), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + vertexQueues_[i].getBuffer().resize(queueSizeCpu[i]); + } + } +} + +void All911Vertices::copyServingCallFromDevice(int numberOfVertices, + All911VerticesDeviceProperties &allVerticesDevice) +{ + // int **servingCallBufferVertexId_; + { + int *callIdCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callIdCpu, allVerticesDevice.servingCallBufferVertexId_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callIdInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callIdInBuffer.resize(maxNumberOfServers_); + HANDLE_ERROR(cudaMemcpy(callIdInBuffer.data(), callIdCpu[i], + maxNumberOfServers_ * sizeof(int), cudaMemcpyDeviceToHost)); + vector buffer = servingCall_[i]; + for (int j = 0; j < buffer.size(); j++) { + buffer[j].vertexId = callIdInBuffer[j]; + } + // clear vector before filling with next vertex's call ids + callIdInBuffer.clear(); + } + } + // uint64_t **servingCallBufferTime_; + { + uint64_t *callTimeCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callTimeCpu, allVerticesDevice.servingCallBufferTime_, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callTimeInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callTimeInBuffer.resize(maxNumberOfServers_); + HANDLE_ERROR(cudaMemcpy(callTimeInBuffer.data(), callTimeCpu[i], + maxNumberOfServers_ * sizeof(uint64_t), cudaMemcpyDeviceToHost)); + vector buffer = servingCall_[i]; + for (int j = 0; j < buffer.size(); j++) { + buffer[j].time = callTimeInBuffer[j]; + } + // clear vector before filling with next vertex's call ids + callTimeInBuffer.clear(); + } + } + // int **servingCallBufferDuration_; + { + int *callDurationCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callDurationCpu, allVerticesDevice.servingCallBufferDuration_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callDurationInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callDurationInBuffer.resize(maxNumberOfServers_); + HANDLE_ERROR(cudaMemcpy(callDurationInBuffer.data(), callDurationCpu[i], + maxNumberOfServers_ * sizeof(int), cudaMemcpyDeviceToHost)); + vector buffer = servingCall_[i]; + for (int j = 0; j < buffer.size(); j++) { + buffer[j].duration = callDurationInBuffer[j]; + } + // clear vector before filling with next vertex's call ids + callDurationInBuffer.clear(); + } + } + // BGFLOAT **servingCallBufferX_; + { + BGFLOAT *callLocationXCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callLocationXCpu, allVerticesDevice.servingCallBufferX_, + numberOfVertices * sizeof(BGFLOAT *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callLocationXInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callLocationXInBuffer.resize(maxNumberOfServers_); + HANDLE_ERROR(cudaMemcpy(callLocationXInBuffer.data(), callLocationXCpu[i], + maxNumberOfServers_ * sizeof(BGFLOAT), cudaMemcpyDeviceToHost)); + vector buffer = servingCall_[i]; + for (int j = 0; j < buffer.size(); j++) { + buffer[j].x = callLocationXInBuffer[j]; + } + // clear vector before filling with next vertex's call ids + callLocationXInBuffer.clear(); + } + } + // BGFLOAT **servingCallBufferY_; + { + BGFLOAT *callLocationYCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callLocationYCpu, allVerticesDevice.servingCallBufferY_, + numberOfVertices * sizeof(BGFLOAT *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callLocationYInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callLocationYInBuffer.resize(maxNumberOfServers_); + HANDLE_ERROR(cudaMemcpy(callLocationYInBuffer.data(), callLocationYCpu[i], + maxNumberOfServers_ * sizeof(BGFLOAT), cudaMemcpyDeviceToHost)); + vector buffer = servingCall_[i]; + for (int j = 0; j < buffer.size(); j++) { + buffer[j].y = callLocationYInBuffer[j]; + } + // clear vector before filling with next vertex's call ids + callLocationYInBuffer.clear(); + } + } + // int **servingCallBufferPatience_; + { + int *callPatienceCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callPatienceCpu, allVerticesDevice.servingCallBufferPatience_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callPatienceInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callPatienceInBuffer.resize(maxNumberOfServers_); + HANDLE_ERROR(cudaMemcpy(callPatienceInBuffer.data(), callPatienceCpu[i], + maxNumberOfServers_ * sizeof(int), cudaMemcpyDeviceToHost)); + vector buffer = servingCall_[i]; + for (int j = 0; j < buffer.size(); j++) { + buffer[j].patience = callPatienceInBuffer[j]; + } + // clear vector before filling with next vertex's call ids + callPatienceInBuffer.clear(); + } + } + // int **servingCallBufferOnSiteTime_; + { + int *callOnSiteTimeCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callOnSiteTimeCpu, allVerticesDevice.servingCallBufferOnSiteTime_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callOnSiteTimeInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callOnSiteTimeInBuffer.resize(maxNumberOfServers_); + HANDLE_ERROR(cudaMemcpy(callOnSiteTimeInBuffer.data(), callOnSiteTimeCpu[i], + maxNumberOfServers_ * sizeof(int), cudaMemcpyDeviceToHost)); + vector buffer = servingCall_[i]; + for (int j = 0; j < buffer.size(); j++) { + buffer[j].onSiteTime = callOnSiteTimeInBuffer[j]; + } + // clear vector before filling with next vertex's call ids + callOnSiteTimeInBuffer.clear(); + } + } + // int **servingCallBufferResponderType_; + { + int *callResponderTypeCpu[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(callResponderTypeCpu, + allVerticesDevice.servingCallBufferResponderType_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + + // Using a vector since we are still on the CPU and it's convenient to call data() + // in memcpy and using the same vector over and over helps with stack memory + // management + vector callResponderTypeInBuffer; + for (int i = 0; i < numberOfVertices; i++) { + callResponderTypeInBuffer.resize(maxNumberOfServers_); + HANDLE_ERROR(cudaMemcpy(callResponderTypeInBuffer.data(), callResponderTypeCpu[i], + maxNumberOfServers_ * sizeof(int), cudaMemcpyDeviceToHost)); + vector buffer = servingCall_[i]; + for (int j = 0; j < buffer.size(); j++) { + if (callResponderTypeInBuffer[j] == 5) { + buffer[j].type = "EMS"; + } else if (callResponderTypeInBuffer[j] == 6) { + buffer[j].type = "Fire"; + } else if (callResponderTypeInBuffer[j] == 7) { + buffer[j].type = "Law"; + } + } + // clear vector before filling with next vertex's call ids + callResponderTypeInBuffer.clear(); + } + } +} + +/// Copy all vertex data to host from device. +void All911Vertices::copyFromDevice() +{ + All911VerticesDeviceProperties allVertices; + Simulator &simulator = Simulator::getInstance(); + GPUModel *gpuModel = static_cast(&(simulator.getModel())); + void *deviceAddress = static_cast(gpuModel->getAllVerticesDevice()); + HANDLE_ERROR(cudaMemcpy(&allVertices, deviceAddress, sizeof(All911VerticesDeviceProperties), + cudaMemcpyDeviceToHost)); + + uint64_t stepsPerEpoch = simulator.getEpochDuration() / simulator.getDeltaT(); + int maxEventsPerEpoch = static_cast(Simulator::getInstance().getEpochDuration() + * Simulator::getInstance().getMaxFiringRate()); + int numberOfVertices = simulator.getTotalVertices(); + + // Copy layout locations + Layout &layout = simulator.getModel().getLayout(); + Layout911 &layout911 = dynamic_cast(layout); + layout911.xloc_.copyToHost(); + layout911.yloc_.copyToHost(); + // int *vertexType_; + HANDLE_ERROR(cudaMemcpy(vertexType_.data(), allVertices.vertexType_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); + // uint64_t **beginTimeHistory_; + { + uint64_t *cpuBeginTimeHistory[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuBeginTimeHistory, allVertices.beginTimeHistory_, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaMemcpy(beginTimeHistory_[i].data(), cpuBeginTimeHistory[i], + maxEventsPerEpoch * sizeof(uint64_t), cudaMemcpyDeviceToHost)); + } + } + // int *beginTimeHistoryBufferFront_; + { + int cpuQueueFront[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuQueueFront, allVertices.beginTimeHistoryBufferFront_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + beginTimeHistory_[i].setBufferFront(cpuQueueFront[i]); + } + } + // int *beginTimeHistoryBufferEnd_; + { + int cpuQueueEnd[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuQueueEnd, allVertices.beginTimeHistoryBufferEnd_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + beginTimeHistory_[i].setBufferEnd(cpuQueueEnd[i]); + } + } + // int *beginTimeHistoryEpochStart_; + { + int cpuEpochStart[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuEpochStart, allVertices.beginTimeHistoryEpochStart_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + beginTimeHistory_[i].setEpochStart(cpuEpochStart[i]); + } + } + // int *beginTimeHistoryNumElementsInEpoch_; + { + int cpuElementsInEpoch[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuElementsInEpoch, allVertices.beginTimeHistoryNumElementsInEpoch_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + beginTimeHistory_[i].setNumElementsInEpoch(cpuElementsInEpoch[i]); + } + } + // uint64_t **answerTimeHistory_; + { + uint64_t *cpuAnswerTimeHistory[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuAnswerTimeHistory, allVertices.answerTimeHistory_, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaMemcpy(answerTimeHistory_[i].data(), cpuAnswerTimeHistory[i], + maxEventsPerEpoch * sizeof(uint64_t), cudaMemcpyDeviceToHost)); + } + } + // int *answerTimeHistoryBufferFront_; + { + int cpuQueueFront[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuQueueFront, allVertices.answerTimeHistoryBufferFront_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + answerTimeHistory_[i].setBufferFront(cpuQueueFront[i]); + } + } + // int *answerTimeHistoryBufferEnd_; + { + int cpuQueueEnd[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuQueueEnd, allVertices.answerTimeHistoryBufferEnd_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + answerTimeHistory_[i].setBufferEnd(cpuQueueEnd[i]); + } + } + // int *answerTimeHistoryEpochStart_; + { + int cpuEpochStart[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuEpochStart, allVertices.answerTimeHistoryEpochStart_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + answerTimeHistory_[i].setEpochStart(cpuEpochStart[i]); + } + } + // int *answerTimeHistoryNumElementsInEpoch_; + { + int cpuElementsInEpoch[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuElementsInEpoch, allVertices.answerTimeHistoryNumElementsInEpoch_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + answerTimeHistory_[i].setNumElementsInEpoch(cpuElementsInEpoch[i]); + } + } + // uint64_t **endTimeHistory_; + { + uint64_t *cpuEndTimeHistory[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuEndTimeHistory, allVertices.endTimeHistory_, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaMemcpy(endTimeHistory_[i].data(), cpuEndTimeHistory[i], + maxEventsPerEpoch * sizeof(uint64_t), cudaMemcpyDeviceToHost)); + } + } + // int *endTimeHistoryBufferFront_; + { + int cpuQueueFront[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuQueueFront, allVertices.endTimeHistoryBufferFront_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + endTimeHistory_[i].setBufferFront(cpuQueueFront[i]); + } + } + // int *endTimeHistoryBufferEnd_; + { + int cpuQueueEnd[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuQueueEnd, allVertices.endTimeHistoryBufferEnd_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + endTimeHistory_[i].setBufferEnd(cpuQueueEnd[i]); + } + } + // int *endTimeHistoryEpochStart_; + { + int cpuEpochStart[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuEpochStart, allVertices.endTimeHistoryEpochStart_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + endTimeHistory_[i].setEpochStart(cpuEpochStart[i]); + } + } + // int *endTimeHistoryNumElementsInEpoch_; + { + int cpuElementsInEpoch[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuElementsInEpoch, allVertices.endTimeHistoryNumElementsInEpoch_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + endTimeHistory_[i].setNumElementsInEpoch(cpuElementsInEpoch[i]); + } + } + // uint64_t **wasAbandonedHistory_; + { + uint64_t *cpuWasAbandonedHistory[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuWasAbandonedHistory, allVertices.wasAbandonedHistory_, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaMemcpy(wasAbandonedHistory_[i].data(), cpuWasAbandonedHistory[i], + maxEventsPerEpoch * sizeof(uint64_t), cudaMemcpyDeviceToHost)); + } + } + // int *wasAbandonedHistoryBufferFront_; + { + int cpuQueueFront[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuQueueFront, allVertices.wasAbandonedHistoryBufferFront_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + wasAbandonedHistory_[i].setBufferFront(cpuQueueFront[i]); + } + } + // int *wasAbandonedHistoryBufferEnd_; + { + int cpuQueueEnd[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuQueueEnd, allVertices.wasAbandonedHistoryBufferEnd_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + wasAbandonedHistory_[i].setBufferEnd(cpuQueueEnd[i]); + } + } + // int *wasAbandonedHistoryEpochStart_; + { + int cpuEpochStart[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuEpochStart, allVertices.wasAbandonedHistoryEpochStart_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + wasAbandonedHistory_[i].setEpochStart(cpuEpochStart[i]); + } + } + // int *wasAbandonedHistoryNumElementsInEpoch_; + { + int cpuElementsInEpoch[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuElementsInEpoch, + allVertices.wasAbandonedHistoryNumElementsInEpoch_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + wasAbandonedHistory_[i].setNumElementsInEpoch(cpuElementsInEpoch[i]); + } + } + // uint64_t **queueLengthHistory_; + { + uint64_t *cpuQueueLengthHistory[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuQueueLengthHistory, allVertices.queueLengthHistory_, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaMemcpy(queueLengthHistory_[i].data(), cpuQueueLengthHistory[i], + stepsPerEpoch * sizeof(uint64_t), cudaMemcpyDeviceToHost)); + } + } + // int *queueLengthHistoryBufferFront_; + { + int cpuQueueFront[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuQueueFront, allVertices.queueLengthHistoryBufferFront_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + queueLengthHistory_[i].setBufferFront(cpuQueueFront[i]); + } + } + // int *queueLengthHistoryBufferEnd_; + { + int cpuQueueEnd[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuQueueEnd, allVertices.queueLengthHistoryBufferEnd_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + queueLengthHistory_[i].setBufferEnd(cpuQueueEnd[i]); + } + } + // int *queueLengthHistoryEpochStart_; + { + int cpuEpochStart[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuEpochStart, allVertices.queueLengthHistoryEpochStart_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + queueLengthHistory_[i].setEpochStart(cpuEpochStart[i]); + } + } + // int *queueLengthHistoryNumElementsInEpoch_; + { + int cpuElementsInEpoch[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuElementsInEpoch, allVertices.queueLengthHistoryNumElementsInEpoch_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + queueLengthHistory_[i].setNumElementsInEpoch(cpuElementsInEpoch[i]); + } + } + // BGFLOAT **utilizationHistory_; + { + BGFLOAT *cpuUtilizationHistory[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuUtilizationHistory, allVertices.utilizationHistory_, + numberOfVertices * sizeof(BGFLOAT *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaMemcpy(utilizationHistory_[i].data(), cpuUtilizationHistory[i], + stepsPerEpoch * sizeof(BGFLOAT), cudaMemcpyDeviceToHost)); + } + } + // int *utilizationHistoryBufferFront_; + { + int cpuQueueFront[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuQueueFront, allVertices.utilizationHistoryBufferFront_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + utilizationHistory_[i].setBufferFront(cpuQueueFront[i]); + } + } + // int *utilizationHistoryBufferEnd_; + { + int cpuQueueEnd[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuQueueEnd, allVertices.utilizationHistoryBufferEnd_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + utilizationHistory_[i].setBufferEnd(cpuQueueEnd[i]); + } + } + // int *utilizationHistoryEpochStart_; + { + int cpuEpochStart[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuEpochStart, allVertices.utilizationHistoryEpochStart_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + utilizationHistory_[i].setEpochStart(cpuEpochStart[i]); + } + } + // int *utilizationHistoryNumElementsInEpoch_; + { + int cpuElementsInEpoch[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuElementsInEpoch, allVertices.utilizationHistoryNumElementsInEpoch_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + utilizationHistory_[i].setNumElementsInEpoch(cpuElementsInEpoch[i]); + } + } + // int **vertexQueuesBufferVertexId_; + // uint64_t **vertexQueuesBufferTime_; + // int **vertexQueuesBufferDuration_; + // BGFLOAT **vertexQueuesBufferX_; + // BGFLOAT **vertexQueuesBufferY_; + // int **vertexQueuesBufferPatience_; + // int **vertexQueuesBufferOnSiteTime_; + // int **vertexQueuesBufferResponderType_; + // uint64_t *vertexQueuesFront_; + // uint64_t *vertexQueuesEnd_; + copyVertexQueuesFromDevice(numberOfVertices, stepsPerEpoch, allVertices); + // int *droppedCalls_; + HANDLE_ERROR(cudaMemcpy(droppedCalls_.data(), allVertices.droppedCalls_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); + // int *receivedCalls_; + HANDLE_ERROR(cudaMemcpy(receivedCalls_.data(), allVertices.receivedCalls_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); + // int *busyServers_; + HANDLE_ERROR(cudaMemcpy(busyServers_.data(), allVertices.busyServers_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); + // int *numServers_; + HANDLE_ERROR(cudaMemcpy(numServers_.data(), allVertices.numServers_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); + // int *numTrunks_; + HANDLE_ERROR(cudaMemcpy(numTrunks_.data(), allVertices.numTrunks_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); + // int **servingCallBufferVertexId_; + // uint64_t **servingCallBufferTime_; + // int **servingCallBufferDuration_; + // BGFLOAT **servingCallBufferX_; + // BGFLOAT **servingCallBufferY_; + // int **servingCallBufferPatience_; + // int **servingCallBufferOnSiteTime_; + // int **servingCallBufferResponderType_; + copyServingCallFromDevice(numberOfVertices, allVertices); + // uint64_t **answerTime_; + { + uint64_t *cpuAnswerTime[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuAnswerTime, allVertices.answerTime_, + numberOfVertices * sizeof(uint64_t *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaMemcpy(answerTime_[i].data(), cpuAnswerTime[i], + maxNumberOfServers_ * sizeof(uint64_t), cudaMemcpyDeviceToHost)); + } + } + // int **serverCountdown_; + { + int *cpuServerCountdown[numberOfVertices]; + HANDLE_ERROR(cudaMemcpy(cpuServerCountdown, allVertices.serverCountdown_, + numberOfVertices * sizeof(int *), cudaMemcpyDeviceToHost)); + for (int i = 0; i < numberOfVertices; i++) { + HANDLE_ERROR(cudaMemcpy(serverCountdown_[i].data(), cpuServerCountdown[i], + maxNumberOfServers_ * sizeof(int), cudaMemcpyDeviceToHost)); + } + } + // int *vertexIdToNoiseIndex_; + HANDLE_ERROR(cudaMemcpy(vertexIdToNoiseIndex_.data(), allVertices.vertexIdToNoiseIndex_, + numberOfVertices * sizeof(int), cudaMemcpyDeviceToHost)); +} + +/// @brief Update internal state of the indexed vertex (called by every simulation step). +/// @param edges Reference to the allEdges struct on host memory. +/// @param allVerticesDevice GPU address of the allVerticesDeviceProperties struct on device memory. +/// @param allEdgesDevice GPU address of the allEdgesDeviceProperties struct on device memory. +/// @param randNoise +/// @param edgeIndexMapDevice GPU address of the EdgeIndexMap on device memory. +void All911Vertices::advanceVertices(AllEdges &edges, void *allVerticesDevice, void *allEdgesDevice, + float randNoise[], EdgeIndexMapDevice *edgeIndexMapDevice) +{ + // Return if no vertices are present + if (size_ == 0) + return; + // CUDA parameters + Simulator &simulator = Simulator::getInstance(); + const int threadsPerBlock = 256; + int blocksPerGrid = (simulator.getTotalVertices() + threadsPerBlock - 1) / threadsPerBlock; + int maxEventsPerEpoch = static_cast(Simulator::getInstance().getEpochDuration() + * Simulator::getInstance().getMaxFiringRate()); + uint64_t stepsPerEpoch = simulator.getEpochDuration() / simulator.getDeltaT(); + Layout &layout = simulator.getModel().getLayout(); + Layout911 &layout911 = dynamic_cast(layout); + BGFLOAT *xLoc_device = layout911.xloc_.getDevicePointer(); + BGFLOAT *yLoc_device = layout911.yloc_.getDevicePointer(); + // Advance vertices -------------> + advance911VerticesDevice<<>>( + size_, maxEventsPerEpoch, stepsPerEpoch, g_simulationStep, avgDrivingSpeed_, pi, randNoise, + redialP_, xLoc_device, yLoc_device, (All911VerticesDeviceProperties *)allVerticesDevice, + (All911EdgesDeviceProperties *)allEdgesDevice, edgeIndexMapDevice); + cudaDeviceSynchronize(); +} + +__global__ void advance911VerticesDevice( + int totalVertices, int maxEventsPerEpoch, uint64_t stepsPerEpoch, uint64_t simulationStep, + BGFLOAT drivingSpeed, BGFLOAT pi, float redialValues[], BGFLOAT redialProbability, + BGFLOAT *xLocation, BGFLOAT *yLocation, All911VerticesDeviceProperties *allVerticesDevice, + All911EdgesDeviceProperties *allEdgesDevice, EdgeIndexMapDevice *edgeIndexMapDevice) +{ + // The usual thread ID calculation and guard against excess threads + // (beyond the number of vertices, in this case). + int idx = blockIdx.x * blockDim.x + threadIdx.x; + if (idx >= totalVertices) + return; + switch (allVerticesDevice->vertexType_[idx]) { + case 3: //CALR + advanceCALRVerticesDevice(idx, stepsPerEpoch, simulationStep, + redialValues[allVerticesDevice->vertexIdToNoiseIndex_[idx]], + redialProbability, allVerticesDevice, allEdgesDevice, + edgeIndexMapDevice); + break; + case 4: //PSAP + advancePSAPVerticesDevice(idx, maxEventsPerEpoch, stepsPerEpoch, simulationStep, xLocation, + yLocation, allVerticesDevice, allEdgesDevice, + edgeIndexMapDevice); + break; + case 5: //EMS + case 6: //FIRE + case 7: //LAW + advanceRESPVerticesDevice(idx, maxEventsPerEpoch, stepsPerEpoch, simulationStep, + drivingSpeed, pi, xLocation, yLocation, allVerticesDevice, + allEdgesDevice, edgeIndexMapDevice); + break; + default: + printf("ERROR: Vertex is of unknown type [%d]\n", allVerticesDevice->vertexType_[idx]); + } +} + +/// CUDA code for advancing Caller region vertices +/// +__device__ void advanceCALRVerticesDevice(int vertexId, uint64_t stepsPerEpoch, + uint64_t simulationStep, BGFLOAT redialValue, + BGFLOAT redialProbability, + All911VerticesDeviceProperties *allVerticesDevice, + All911EdgesDeviceProperties *allEdgesDevice, + EdgeIndexMapDevice *edgeIndexMapDevice) +{ + // There is only one outgoing edge from CALR to a PSAP + //BGSIZE start = edgeIndexMapDevice->outgoingEdgeBegin_[vertexId]; + BGSIZE edgeIdx + = edgeIndexMapDevice->outgoingEdgeIndexMap_[edgeIndexMapDevice->outgoingEdgeBegin_[vertexId]]; + + // Check for dropped calls, indicated by the edge not being available + // if (!allEdgesDevice->isAvailable_[edgeIdx]) { + // // If the call is still there, it means that there was no space in the PSAP's waiting + // // queue. Therefore, this is a dropped call. + // // If readialing, we assume that it happens immediately and the caller tries until + // // getting through. + // if (!allEdgesDevice->isRedial_[edgeIdx] && redialValue >= redialProbability) { + // // We only make the edge available if no readialing occurs. + // allEdgesDevice->isAvailable_[edgeIdx] = true; + // //LOG4CPLUS_DEBUG(vertexLogger_, "Did not redial at time: " << edges911.call_[edgeIdx].time); + // } else { + // // Keep the edge unavailable but mark it as a redial + // allEdgesDevice->isRedial_[edgeIdx] = true; + // } + // } + unsigned char makeAvailable = (1 - allEdgesDevice->isAvailable_[edgeIdx]) + * (1 - allEdgesDevice->isRedial_[edgeIdx]) + * (unsigned char)(redialValue >= redialProbability); + + allEdgesDevice->isAvailable_[edgeIdx] |= makeAvailable; + allEdgesDevice->isRedial_[edgeIdx] + |= (1 - allEdgesDevice->isAvailable_[edgeIdx]) * (1 - makeAvailable); + + // peek at the next call in the queue + uint64_t &queueEndIndex = allVerticesDevice->vertexQueuesEnd_[vertexId]; + if (allEdgesDevice->isAvailable_[edgeIdx] + && (allVerticesDevice->vertexQueuesFront_[vertexId] != queueEndIndex) + && allVerticesDevice->vertexQueuesBufferTime_[vertexId][queueEndIndex] <= simulationStep) { + // Place new call in the edge going to the PSAP + if (!allEdgesDevice->isAvailable_[edgeIdx]) { + printf("ERROR: Edge ID [%d] already has a call for vertex ID [%d]\n", edgeIdx, vertexId); + return; + } + // Calls that start at the same time are process in the order they appear. + // The call starts at the current time step so we need to pop it and process it + // Process the call + allEdgesDevice->vertexId_[edgeIdx] + = allVerticesDevice->vertexQueuesBufferVertexId_[vertexId][queueEndIndex]; + allEdgesDevice->time_[edgeIdx] + = allVerticesDevice->vertexQueuesBufferTime_[vertexId][queueEndIndex]; + allEdgesDevice->duration_[edgeIdx] + = allVerticesDevice->vertexQueuesBufferDuration_[vertexId][queueEndIndex]; + allEdgesDevice->x_[edgeIdx] + = allVerticesDevice->vertexQueuesBufferX_[vertexId][queueEndIndex]; + allEdgesDevice->y_[edgeIdx] + = allVerticesDevice->vertexQueuesBufferY_[vertexId][queueEndIndex]; + allEdgesDevice->patience_[edgeIdx] + = allVerticesDevice->vertexQueuesBufferPatience_[vertexId][queueEndIndex]; + allEdgesDevice->onSiteTime_[edgeIdx] + = allVerticesDevice->vertexQueuesBufferOnSiteTime_[vertexId][queueEndIndex]; + allEdgesDevice->responderType_[edgeIdx] + = allVerticesDevice->vertexQueuesBufferResponderType_[vertexId][queueEndIndex]; + + // Pop from the queue + queueEndIndex = (queueEndIndex + 1) % (stepsPerEpoch + 1); + allEdgesDevice->isAvailable_[edgeIdx] = false; + } +} + +/// CUDA code for advancing PSAP vertices +/// +__device__ void advancePSAPVerticesDevice(int vertexIdx, int maxEventsPerEpoch, + uint64_t stepsPerEpoch, uint64_t simulationStep, + BGFLOAT *xLocation, BGFLOAT *yLocation, + All911VerticesDeviceProperties *allVerticesDevice, + All911EdgesDeviceProperties *allEdgesDevice, + EdgeIndexMapDevice *edgeIndexMapDevice) +{ + // Loop over all servers and free the ones finishing serving calls + int numberOfAvailableServers = 0; + unsigned char *availableServers + = (unsigned char *)malloc(allVerticesDevice->numServers_[vertexIdx] * sizeof(unsigned char)); + // Sanity check that malloc was successful + if (availableServers == nullptr) { + printf("ERROR: Failed to allocate memory for availableServers used by vertex ID [%d]\n", + vertexIdx); + return; + } + // Initialize to no servers having been assigned a call yet + // for (BGSIZE serverIndex = 0; serverIndex < allVerticesDevice->numServers_[vertexIdx]; serverIndex++) { + // availableServers[serverIndex] = false; + // } + for (size_t server = 0; server < allVerticesDevice->numServers_[vertexIdx]; ++server) { + // if (allVerticesDevice->serverCountdown_[vertexIdx][server] == 0) { + // // Server is available to take calls. This check is needed because calls + // // could have duration of zero or server has not been assigned a call yet + // availableServers[server] = true; + // numberOfAvailableServers++; + // } else if (--allVerticesDevice->serverCountdown_[vertexIdx][server] == 0) { + // // Server becomes free to take calls + // // TODO: What about wrap-up time? + + // //Store call metrics + // // Store wasAbandonedHistory + // // EventBuffer::insertEvent + // if (allVerticesDevice->wasAbandonedHistoryNumElementsInEpoch_[vertexIdx] >= maxEventsPerEpoch) { + // printf("ERROR: wasAbandonHistory buffer is full. Vertex ID [%d] Buffer size [%d] Number of Elements in Epoch [%d]\n", vertexIdx, maxEventsPerEpoch, allVerticesDevice->wasAbandonedHistoryNumElementsInEpoch_[vertexIdx]); + // return; + // } + // int &abandonedHistoryQueueEnd = allVerticesDevice->wasAbandonedHistoryBufferEnd_[vertexIdx]; + // allVerticesDevice->wasAbandonedHistory_[vertexIdx][abandonedHistoryQueueEnd] = false; + // abandonedHistoryQueueEnd = (abandonedHistoryQueueEnd + 1) % maxEventsPerEpoch; + // allVerticesDevice->wasAbandonedHistoryNumElementsInEpoch_[vertexIdx]++; + // // Store beginTimeHistory + // // EventBuffer::insertEvent + // if (allVerticesDevice->beginTimeHistoryNumElementsInEpoch_[vertexIdx] >= maxEventsPerEpoch) { + // printf("ERROR: beginTimeHistory buffer is full. Vertex ID [%d] Buffer size [%d] Number of Elements in Epoch [%d]\n", vertexIdx, maxEventsPerEpoch, allVerticesDevice->beginTimeHistoryNumElementsInEpoch_[vertexIdx]); + // return; + // } + // int &beginHistoryQueueEnd = allVerticesDevice->beginTimeHistoryBufferEnd_[vertexIdx]; + // allVerticesDevice->beginTimeHistory_[vertexIdx][beginHistoryQueueEnd] = allVerticesDevice->servingCallBufferTime_[vertexIdx][server]; + // beginHistoryQueueEnd = (beginHistoryQueueEnd + 1) % maxEventsPerEpoch; + // allVerticesDevice->beginTimeHistoryNumElementsInEpoch_[vertexIdx]++; + // // Store answerTimeHistory + // // EventBuffer::insertEvent + // if (allVerticesDevice->answerTimeHistoryNumElementsInEpoch_[vertexIdx] >= maxEventsPerEpoch) { + // printf("ERROR: answerTimeHistory buffer is full. Vertex ID [%d] Buffer size [%d] Number of Elements in Epoch [%d]\n", vertexIdx, maxEventsPerEpoch, allVerticesDevice->answerTimeHistoryNumElementsInEpoch_[vertexIdx]); + // return; + // } + // int &answerHistoryQueueEnd = allVerticesDevice->answerTimeHistoryBufferEnd_[vertexIdx]; + // allVerticesDevice->answerTimeHistory_[vertexIdx][answerHistoryQueueEnd] = allVerticesDevice->answerTime_[vertexIdx][server]; + // answerHistoryQueueEnd = (answerHistoryQueueEnd + 1) % maxEventsPerEpoch; + // allVerticesDevice->answerTimeHistoryNumElementsInEpoch_[vertexIdx]++; + // // Store endTimeHistory + // // EventBuffer::insertEvent + // if (allVerticesDevice->endTimeHistoryNumElementsInEpoch_[vertexIdx] >= maxEventsPerEpoch) { + // printf("ERROR: endTimeHistory buffer is full. Vertex ID [%d] Buffer size [%d] Number of Elements in Epoch [%d]\n", vertexIdx, maxEventsPerEpoch, allVerticesDevice->endTimeHistoryNumElementsInEpoch_[vertexIdx]); + // return; + // } + // int &endHistoryQueueEnd = allVerticesDevice->endTimeHistoryBufferEnd_[vertexIdx]; + // allVerticesDevice->endTimeHistory_[vertexIdx][endHistoryQueueEnd] = simulationStep; + // endHistoryQueueEnd = (endHistoryQueueEnd + 1) % maxEventsPerEpoch; + // allVerticesDevice->endTimeHistoryNumElementsInEpoch_[vertexIdx]++; + + // int requiredType = allVerticesDevice->servingCallBufferResponderType_[vertexIdx][server]; + + // // loop over the outgoing edges looking for the responder with the shortest + // // Euclidean distance to the call's location. + // BGSIZE startOutEdg = edgeIndexMapDevice->outgoingEdgeBegin_[vertexIdx]; + // BGSIZE outEdgCount = edgeIndexMapDevice->outgoingEdgeCount_[vertexIdx]; + + // BGSIZE resp, respEdge; + // BGFLOAT minDistance = FLT_MAX; + // for (BGSIZE eIdxMap = startOutEdg; eIdxMap < startOutEdg + outEdgCount; ++eIdxMap) { + // BGSIZE outEdg = edgeIndexMapDevice->outgoingEdgeIndexMap_[eIdxMap]; + // if (!allEdgesDevice->inUse_[outEdg]) { + // printf("ERROR: Edge must be in use. Edge ID [%d] Vertex ID [%d]\n", outEdg, vertexIdx); + // return; + // } + + // BGSIZE dstVertex = allEdgesDevice->destVertexIndex_[outEdg]; + // if (allVerticesDevice->vertexType_[dstVertex] == requiredType) { + // // call x + // BGFLOAT callX = allVerticesDevice->servingCallBufferX_[vertexIdx][server]; + // // call y + // BGFLOAT callY = allVerticesDevice->servingCallBufferY_[vertexIdx][server]; + // // Vertex x + // BGFLOAT dstVertexLocationX = xLocation[dstVertex]; + // // Vertex y + // BGFLOAT dstVertexLocationY = yLocation[dstVertex]; + // // Calculates the distance between the given vertex and the (x, y) coordinates of a call + // BGFLOAT distance = sqrtf(powf(callX - dstVertexLocationX, 2) + (powf(callY - dstVertexLocationY, 2))); + + // if (distance < minDistance) { + // minDistance = distance; + // resp = dstVertex; + // respEdge = outEdg; + // } + // } + // } + + // // We must have found the closest responder of the right type + // if (minDistance >= FLT_MAX) { + // printf("ERROR: Distance found was not the minimum distance. Distance [%f] Responder Edge ID [%u] Vertex ID [%d]\n", minDistance, respEdge, vertexIdx); + // return; + // } + // if (allVerticesDevice->vertexType_[resp] != requiredType) { + // printf("ERROR: Responder vertex was the wrong type. Responder Type [%d] Required Type [%d]\n", allVerticesDevice->vertexType_[respEdge], requiredType); + // return; + // } + + // // Place the call in the edge going to the responder + // // Call becomes a dispatch order at this time + // allVerticesDevice->servingCallBufferTime_[vertexIdx][server] = simulationStep; + + // //edges911.call_[respEdge] = endingCall; + // allEdgesDevice->vertexId_[respEdge] = allVerticesDevice->servingCallBufferVertexId_[vertexIdx][server]; + // allEdgesDevice->time_[respEdge] = allVerticesDevice->servingCallBufferTime_[vertexIdx][server]; + // allEdgesDevice->duration_[respEdge] = allVerticesDevice->servingCallBufferDuration_[vertexIdx][server]; + // allEdgesDevice->x_[respEdge] = allVerticesDevice->servingCallBufferX_[vertexIdx][server]; + // allEdgesDevice->y_[respEdge] = allVerticesDevice->servingCallBufferY_[vertexIdx][server]; + // allEdgesDevice->patience_[respEdge] = allVerticesDevice->servingCallBufferPatience_[vertexIdx][server]; + // allEdgesDevice->onSiteTime_[respEdge] = allVerticesDevice->servingCallBufferOnSiteTime_[vertexIdx][server]; + // allEdgesDevice->responderType_[respEdge] = allVerticesDevice->servingCallBufferResponderType_[vertexIdx][server]; + + // allEdgesDevice->isAvailable_[respEdge] = false; + + // // This assumes that the caller doesn't stay in the line until the responder + // // arrives on scene. This not true in all instances. + // availableServers[server] = true; + // numberOfAvailableServers++; + // } + int countdown = allVerticesDevice->serverCountdown_[vertexIdx][server]; + // Check if countdown was already 0 + int countdownWasZero = countdown == 0; + + // Decrement if it was not already 0 + countdown -= (1 - countdownWasZero); + allVerticesDevice->serverCountdown_[vertexIdx][server] = countdown; + + // Countdown became zero after decrement so unit is becoming available + //int countdownNowZero = countdown == 0; + + // Set the available unit if it was already available or became available + availableServers[server] = (unsigned char)(countdown == 0); + numberOfAvailableServers += (countdown == 0); + + // If it became zero, the unit responds to the new incident + //int countdownBecameZero = (!countdownWasZero) & countdownNowZero; + if ((!countdownWasZero) & (countdown == 0)) { + // Server becomes free to take calls + // TODO: What about wrap-up time? + + //Store call metrics + // Store wasAbandonedHistory + // EventBuffer::insertEvent + if (allVerticesDevice->wasAbandonedHistoryNumElementsInEpoch_[vertexIdx] + >= maxEventsPerEpoch) { + printf( + "ERROR: wasAbandonHistory buffer is full. Vertex ID [%d] Buffer size [%d] Number of Elements in Epoch [%d]\n", + vertexIdx, maxEventsPerEpoch, + allVerticesDevice->wasAbandonedHistoryNumElementsInEpoch_[vertexIdx]); + return; + } + int &abandonedHistoryQueueEnd + = allVerticesDevice->wasAbandonedHistoryBufferEnd_[vertexIdx]; + allVerticesDevice->wasAbandonedHistory_[vertexIdx][abandonedHistoryQueueEnd] = false; + abandonedHistoryQueueEnd = (abandonedHistoryQueueEnd + 1) % maxEventsPerEpoch; + allVerticesDevice->wasAbandonedHistoryNumElementsInEpoch_[vertexIdx]++; + // Store beginTimeHistory + // EventBuffer::insertEvent + if (allVerticesDevice->beginTimeHistoryNumElementsInEpoch_[vertexIdx] + >= maxEventsPerEpoch) { + printf( + "ERROR: beginTimeHistory buffer is full. Vertex ID [%d] Buffer size [%d] Number of Elements in Epoch [%d]\n", + vertexIdx, maxEventsPerEpoch, + allVerticesDevice->beginTimeHistoryNumElementsInEpoch_[vertexIdx]); + return; + } + int &beginHistoryQueueEnd = allVerticesDevice->beginTimeHistoryBufferEnd_[vertexIdx]; + allVerticesDevice->beginTimeHistory_[vertexIdx][beginHistoryQueueEnd] + = allVerticesDevice->servingCallBufferTime_[vertexIdx][server]; + beginHistoryQueueEnd = (beginHistoryQueueEnd + 1) % maxEventsPerEpoch; + allVerticesDevice->beginTimeHistoryNumElementsInEpoch_[vertexIdx]++; + // Store answerTimeHistory + // EventBuffer::insertEvent + if (allVerticesDevice->answerTimeHistoryNumElementsInEpoch_[vertexIdx] + >= maxEventsPerEpoch) { + printf( + "ERROR: answerTimeHistory buffer is full. Vertex ID [%d] Buffer size [%d] Number of Elements in Epoch [%d]\n", + vertexIdx, maxEventsPerEpoch, + allVerticesDevice->answerTimeHistoryNumElementsInEpoch_[vertexIdx]); + return; + } + int &answerHistoryQueueEnd = allVerticesDevice->answerTimeHistoryBufferEnd_[vertexIdx]; + allVerticesDevice->answerTimeHistory_[vertexIdx][answerHistoryQueueEnd] + = allVerticesDevice->answerTime_[vertexIdx][server]; + answerHistoryQueueEnd = (answerHistoryQueueEnd + 1) % maxEventsPerEpoch; + allVerticesDevice->answerTimeHistoryNumElementsInEpoch_[vertexIdx]++; + // Store endTimeHistory + // EventBuffer::insertEvent + if (allVerticesDevice->endTimeHistoryNumElementsInEpoch_[vertexIdx] >= maxEventsPerEpoch) { + printf( + "ERROR: endTimeHistory buffer is full. Vertex ID [%d] Buffer size [%d] Number of Elements in Epoch [%d]\n", + vertexIdx, maxEventsPerEpoch, + allVerticesDevice->endTimeHistoryNumElementsInEpoch_[vertexIdx]); + return; + } + int &endHistoryQueueEnd = allVerticesDevice->endTimeHistoryBufferEnd_[vertexIdx]; + allVerticesDevice->endTimeHistory_[vertexIdx][endHistoryQueueEnd] = simulationStep; + endHistoryQueueEnd = (endHistoryQueueEnd + 1) % maxEventsPerEpoch; + allVerticesDevice->endTimeHistoryNumElementsInEpoch_[vertexIdx]++; + + // loop over the outgoing edges looking for the responder with the shortest + // Euclidean distance to the call's location. + BGSIZE resp, respEdge; + BGFLOAT minDistance = FLT_MAX; + for (BGSIZE eIdxMap = edgeIndexMapDevice->outgoingEdgeBegin_[vertexIdx]; + eIdxMap < edgeIndexMapDevice->outgoingEdgeBegin_[vertexIdx] + + edgeIndexMapDevice->outgoingEdgeCount_[vertexIdx]; + ++eIdxMap) { + if (!allEdgesDevice->inUse_[edgeIndexMapDevice->outgoingEdgeIndexMap_[eIdxMap]]) { + printf("ERROR: Edge must be in use. Edge ID [%d] Vertex ID [%d]\n", + edgeIndexMapDevice->outgoingEdgeIndexMap_[eIdxMap], vertexIdx); + return; + } + + if (allVerticesDevice + ->vertexType_[allEdgesDevice->destVertexIndex_ + [edgeIndexMapDevice->outgoingEdgeIndexMap_[eIdxMap]]] + == allVerticesDevice->servingCallBufferResponderType_[vertexIdx][server]) { + // call x + //BGFLOAT callX = allVerticesDevice->servingCallBufferX_[vertexIdx][server]; + // call y + //BGFLOAT callY = allVerticesDevice->servingCallBufferY_[vertexIdx][server]; + // Vertex x + //BGFLOAT dstVertexLocationX = xLocation[allEdgesDevice->destVertexIndex_[edgeIndexMapDevice->outgoingEdgeIndexMap_[eIdxMap]]]; + // Vertex y + //BGFLOAT dstVertexLocationY = yLocation[allEdgesDevice->destVertexIndex_[edgeIndexMapDevice->outgoingEdgeIndexMap_[eIdxMap]]]; + // Calculates the distance between the given vertex and the (x, y) coordinates of a call + BGFLOAT distance = sqrtf( + powf(allVerticesDevice->servingCallBufferX_[vertexIdx][server] + - xLocation[allEdgesDevice->destVertexIndex_ + [edgeIndexMapDevice->outgoingEdgeIndexMap_[eIdxMap]]], + 2) + + (powf(allVerticesDevice->servingCallBufferY_[vertexIdx][server] + - yLocation[allEdgesDevice->destVertexIndex_ + [edgeIndexMapDevice->outgoingEdgeIndexMap_[eIdxMap]]], + 2))); + + if (distance < minDistance) { + minDistance = distance; + resp = allEdgesDevice + ->destVertexIndex_[edgeIndexMapDevice->outgoingEdgeIndexMap_[eIdxMap]]; + respEdge = edgeIndexMapDevice->outgoingEdgeIndexMap_[eIdxMap]; + } + } + } + + // We must have found the closest responder of the right type + if (minDistance >= FLT_MAX) { + printf( + "ERROR: Distance found was not the minimum distance. Distance [%f] Responder Edge ID [%u] Vertex ID [%d]\n", + minDistance, respEdge, vertexIdx); + return; + } + if (allVerticesDevice->vertexType_[resp] + != allVerticesDevice->servingCallBufferResponderType_[vertexIdx][server]) { + printf( + "ERROR: Responder vertex was the wrong type. Responder Type [%d] Required Type [%d]\n", + allVerticesDevice->vertexType_[respEdge], + allVerticesDevice->servingCallBufferResponderType_[vertexIdx][server]); + return; + } + + // Place the call in the edge going to the responder + // Call becomes a dispatch order at this time + allVerticesDevice->servingCallBufferTime_[vertexIdx][server] = simulationStep; + + //edges911.call_[respEdge] = endingCall; + allEdgesDevice->vertexId_[respEdge] + = allVerticesDevice->servingCallBufferVertexId_[vertexIdx][server]; + allEdgesDevice->time_[respEdge] + = allVerticesDevice->servingCallBufferTime_[vertexIdx][server]; + allEdgesDevice->duration_[respEdge] + = allVerticesDevice->servingCallBufferDuration_[vertexIdx][server]; + allEdgesDevice->x_[respEdge] = allVerticesDevice->servingCallBufferX_[vertexIdx][server]; + allEdgesDevice->y_[respEdge] = allVerticesDevice->servingCallBufferY_[vertexIdx][server]; + allEdgesDevice->patience_[respEdge] + = allVerticesDevice->servingCallBufferPatience_[vertexIdx][server]; + allEdgesDevice->onSiteTime_[respEdge] + = allVerticesDevice->servingCallBufferOnSiteTime_[vertexIdx][server]; + allEdgesDevice->responderType_[respEdge] + = allVerticesDevice->servingCallBufferResponderType_[vertexIdx][server]; + + allEdgesDevice->isAvailable_[respEdge] = false; + } + } + + // Assign calls to servers until either no servers are available or + // there are no more calls in the waiting queue + int currentlyAvailableServers = numberOfAvailableServers; + //uint64_t queueFrontIndex = allVerticesDevice->vertexQueuesFront_[vertexIdx]; + uint64_t &queueEndIndex = allVerticesDevice->vertexQueuesEnd_[vertexIdx]; + while (currentlyAvailableServers > 0 + && !(allVerticesDevice->vertexQueuesFront_[vertexIdx] == queueEndIndex)) { + // TODO: calls with duration of zero are being added but because countdown will be zero + // they don't show up in the logs + int callId = allVerticesDevice->vertexQueuesBufferVertexId_[vertexIdx][queueEndIndex]; + uint64_t callTime = allVerticesDevice->vertexQueuesBufferTime_[vertexIdx][queueEndIndex]; + int callDuration = allVerticesDevice->vertexQueuesBufferDuration_[vertexIdx][queueEndIndex]; + BGFLOAT callX = allVerticesDevice->vertexQueuesBufferX_[vertexIdx][queueEndIndex]; + BGFLOAT callY = allVerticesDevice->vertexQueuesBufferY_[vertexIdx][queueEndIndex]; + int callPatience = allVerticesDevice->vertexQueuesBufferPatience_[vertexIdx][queueEndIndex]; + int callOnSiteTime + = allVerticesDevice->vertexQueuesBufferOnSiteTime_[vertexIdx][queueEndIndex]; + int callResponderType + = allVerticesDevice->vertexQueuesBufferResponderType_[vertexIdx][queueEndIndex]; + queueEndIndex = (queueEndIndex + 1) % (allVerticesDevice->numTrunks_[vertexIdx] + 1); + + if (callPatience < (simulationStep - callTime)) { + // If the patience time is less than the waiting time, the call is abandoned + // Store wasAbandonedHistory + // EventBuffer::insertEvent + if (allVerticesDevice->wasAbandonedHistoryNumElementsInEpoch_[vertexIdx] + >= maxEventsPerEpoch) { + printf( + "ERROR: wasAbandonHistory buffer is full. Vertex ID [%d] Buffer size [%d] Number of Elements in Epoch [%d]\n", + vertexIdx, maxEventsPerEpoch, + allVerticesDevice->wasAbandonedHistoryNumElementsInEpoch_[vertexIdx]); + return; + } + int &abandonedHistoryQueueEnd + = allVerticesDevice->wasAbandonedHistoryBufferEnd_[vertexIdx]; + allVerticesDevice->wasAbandonedHistory_[vertexIdx][abandonedHistoryQueueEnd] = true; + abandonedHistoryQueueEnd = (abandonedHistoryQueueEnd + 1) % maxEventsPerEpoch; + allVerticesDevice->wasAbandonedHistoryNumElementsInEpoch_[vertexIdx]++; + // Store beginTimeHistory + // EventBuffer::insertEvent + if (allVerticesDevice->beginTimeHistoryNumElementsInEpoch_[vertexIdx] + >= maxEventsPerEpoch) { + printf( + "ERROR: beginTimeHistory buffer is full. Vertex ID [%d] Buffer size [%d] Number of Elements in Epoch [%d]\n", + vertexIdx, maxEventsPerEpoch, + allVerticesDevice->beginTimeHistoryNumElementsInEpoch_[vertexIdx]); + return; + } + int &beginHistoryQueueEnd = allVerticesDevice->beginTimeHistoryBufferEnd_[vertexIdx]; + allVerticesDevice->beginTimeHistory_[vertexIdx][beginHistoryQueueEnd] = callTime; + beginHistoryQueueEnd = (beginHistoryQueueEnd + 1) % maxEventsPerEpoch; + allVerticesDevice->beginTimeHistoryNumElementsInEpoch_[vertexIdx]++; + // Answer time and end time get zero as sentinel for non-valid values + // Store answerTimeHistory + // EventBuffer::insertEvent + if (allVerticesDevice->answerTimeHistoryNumElementsInEpoch_[vertexIdx] + >= maxEventsPerEpoch) { + printf( + "ERROR: answerTimeHistory buffer is full. Vertex ID [%d] Buffer size [%d] Number of Elements in Epoch [%d]\n", + vertexIdx, maxEventsPerEpoch, + allVerticesDevice->answerTimeHistoryNumElementsInEpoch_[vertexIdx]); + return; + } + int &answerHistoryQueueEnd = allVerticesDevice->answerTimeHistoryBufferEnd_[vertexIdx]; + allVerticesDevice->answerTimeHistory_[vertexIdx][answerHistoryQueueEnd] = 0; + answerHistoryQueueEnd = (answerHistoryQueueEnd + 1) % maxEventsPerEpoch; + allVerticesDevice->answerTimeHistoryNumElementsInEpoch_[vertexIdx]++; + // Store endTimeHistory + // EventBuffer::insertEvent + if (allVerticesDevice->endTimeHistoryNumElementsInEpoch_[vertexIdx] >= maxEventsPerEpoch) { + printf( + "ERROR: endTimeHistory buffer is full. Vertex ID [%d] Buffer size [%d] Number of Elements in Epoch [%d]\n", + vertexIdx, maxEventsPerEpoch, + allVerticesDevice->endTimeHistoryNumElementsInEpoch_[vertexIdx]); + return; + } + int &endHistoryQueueEnd = allVerticesDevice->endTimeHistoryBufferEnd_[vertexIdx]; + allVerticesDevice->endTimeHistory_[vertexIdx][endHistoryQueueEnd] = 0; + endHistoryQueueEnd = (endHistoryQueueEnd + 1) % maxEventsPerEpoch; + allVerticesDevice->endTimeHistoryNumElementsInEpoch_[vertexIdx]++; + } else { + // The available server starts serving the call + int availServer = -1; + for (BGSIZE serverIndex = 0; serverIndex < allVerticesDevice->numServers_[vertexIdx]; + serverIndex++) { + // if (availableServers[serverIndex] == true) { + // // If server is available, have that server serve the call + // availServer = serverIndex; + // availableServers[serverIndex] = false; + // currentlyAvailableServers--; + // break; + // } + // Add 0 if server is not available or 1 + serverIndex if it's available and a server has not already been found + availServer + += (availableServers[serverIndex] == true && availServer == -1) * (serverIndex + 1); + // Decrement by 1 if the server is available and a server has not already been found + currentlyAvailableServers + -= (availableServers[serverIndex] == true && availServer == -1); + // Flip value only if the server is available and a server has not been found + availableServers[serverIndex] + = (unsigned char)(availableServers[serverIndex] + == true + - (availableServers[serverIndex] == true + && availServer == -1)); + } + allVerticesDevice->servingCallBufferVertexId_[vertexIdx][availServer] = callId; + allVerticesDevice->servingCallBufferTime_[vertexIdx][availServer] = callTime; + allVerticesDevice->servingCallBufferDuration_[vertexIdx][availServer] = callDuration; + allVerticesDevice->servingCallBufferX_[vertexIdx][availServer] = callX; + allVerticesDevice->servingCallBufferY_[vertexIdx][availServer] = callY; + allVerticesDevice->servingCallBufferPatience_[vertexIdx][availServer] = callPatience; + allVerticesDevice->servingCallBufferOnSiteTime_[vertexIdx][availServer] = callOnSiteTime; + allVerticesDevice->servingCallBufferResponderType_[vertexIdx][availServer] + = callResponderType; + + allVerticesDevice->answerTime_[vertexIdx][availServer] = simulationStep; + allVerticesDevice->serverCountdown_[vertexIdx][availServer] = callDuration; + } + } + + // Update number of busy servers. This is used to check if there is space in the queue + allVerticesDevice->busyServers_[vertexIdx] + = allVerticesDevice->numServers_[vertexIdx] - numberOfAvailableServers; + + // Update queueLength and utilization histories + // Compute the size of the destination queue for queue length + //uint64_t queueSize; + // if (queueFrontIndex >= queueEndIndex) { + // queueSize = queueFrontIndex - queueEndIndex; + // } else { + // queueSize = stepsPerEpoch + queueFrontIndex - queueEndIndex; + // } + //queueSize = stepsPerEpoch * (1 - (queueFrontIndex >= queueEndIndex)) + queueFrontIndex - queueEndIndex; + // EventBuffer::insertEvent + if (allVerticesDevice->queueLengthHistoryNumElementsInEpoch_[vertexIdx] >= stepsPerEpoch) { + printf("ERROR: queueLengthHistory buffer is full. Vertex ID [%d] Buffer size [%" PRIu64 + "] Number of Elements in Epoch [%d]\n", + vertexIdx, stepsPerEpoch, + allVerticesDevice->queueLengthHistoryNumElementsInEpoch_[vertexIdx]); + return; + } + int &queueLengthHistoryQueueEnd = allVerticesDevice->queueLengthHistoryBufferEnd_[vertexIdx]; + allVerticesDevice->queueLengthHistory_[vertexIdx][queueLengthHistoryQueueEnd] + = stepsPerEpoch * (1 - (allVerticesDevice->vertexQueuesFront_[vertexIdx] >= queueEndIndex)) + + allVerticesDevice->vertexQueuesFront_[vertexIdx] - queueEndIndex; + queueLengthHistoryQueueEnd = (queueLengthHistoryQueueEnd + 1) % stepsPerEpoch; + allVerticesDevice->queueLengthHistoryNumElementsInEpoch_[vertexIdx]++; + // EventBuffer::insertEvent + if (allVerticesDevice->utilizationHistoryNumElementsInEpoch_[vertexIdx] >= stepsPerEpoch) { + printf("ERROR: utilizationHistory buffer is full. Vertex ID [%d] Buffer size [%" PRIu64 + "] Number of Elements in Epoch [%d]\n", + vertexIdx, stepsPerEpoch, + allVerticesDevice->utilizationHistoryNumElementsInEpoch_[vertexIdx]); + return; + } + int &utilizationHistoryQueueEnd = allVerticesDevice->utilizationHistoryBufferEnd_[vertexIdx]; + allVerticesDevice->utilizationHistory_[vertexIdx][utilizationHistoryQueueEnd] + = static_cast(allVerticesDevice->busyServers_[vertexIdx]) + / allVerticesDevice->numServers_[vertexIdx]; + utilizationHistoryQueueEnd = (utilizationHistoryQueueEnd + 1) % stepsPerEpoch; + allVerticesDevice->utilizationHistoryNumElementsInEpoch_[vertexIdx]++; + + // Free the availableServers array + free(availableServers); +} + +/// CUDA code for advancing emergency responder vertices +/// +__device__ void advanceRESPVerticesDevice(int vertexIdx, int maxEventsPerEpoch, + uint64_t stepsPerEpoch, uint64_t simulationStep, + BGFLOAT drivingSpeed, BGFLOAT pi, BGFLOAT *xLocation, + BGFLOAT *yLocation, + All911VerticesDeviceProperties *allVerticesDevice, + All911EdgesDeviceProperties *allEdgesDevice, + EdgeIndexMapDevice *edgeIndexMapDevice) +{ + // Free the units finishing up with emergency responses + int numberOfAvailableUnits = 0; + unsigned char *availableUnits + = (unsigned char *)malloc(allVerticesDevice->numServers_[vertexIdx] * sizeof(unsigned char)); + // Sanity check that malloc was successful + if (availableUnits == nullptr) { + printf("ERROR: Failed to allocate memory for availableUnits used by vertex ID [%d]\n", + vertexIdx); + return; + } + // for (BGSIZE unitIndex = 0; unitIndex < numberOfUnits; unitIndex++) { + // availableUnits[unitIndex] = false; + // } + for (size_t unit = 0; unit < allVerticesDevice->numServers_[vertexIdx]; ++unit) { + // if (allVerticesDevice->serverCountdown_[vertexIdx][unit] == 0) { + // // Unit is available + // availableUnits[unit] = true; + // numberOfAvailableUnits++; + // } else if (--allVerticesDevice->serverCountdown_[vertexIdx][unit] == 0) { + // // Unit becomes available to responde to new incidents + + // //Store incident response metrics + // // Store wasAbandonedHistory + // // EventBuffer::insertEvent + // if (allVerticesDevice->wasAbandonedHistoryNumElementsInEpoch_[vertexIdx] >= maxEventsPerEpoch) { + // printf("ERROR: wasAbandonHistory buffer is full. Vertex ID [%d] Buffer size [%d] Number of Elements in Epoch [%d]\n", vertexIdx, maxEventsPerEpoch, allVerticesDevice->wasAbandonedHistoryNumElementsInEpoch_[vertexIdx]); + // return; + // } + // int &abandonedHistoryQueueEnd = allVerticesDevice->wasAbandonedHistoryBufferEnd_[vertexIdx]; + // allVerticesDevice->wasAbandonedHistory_[vertexIdx][abandonedHistoryQueueEnd] = false; + // abandonedHistoryQueueEnd = (abandonedHistoryQueueEnd + 1) % maxEventsPerEpoch; + // allVerticesDevice->wasAbandonedHistoryNumElementsInEpoch_[vertexIdx]++; + // // Store beginTimeHistory + // // EventBuffer::insertEvent + // if (allVerticesDevice->beginTimeHistoryNumElementsInEpoch_[vertexIdx] >= maxEventsPerEpoch) { + // printf("ERROR: beginTimeHistory buffer is full. Vertex ID [%d] Buffer size [%d] Number of Elements in Epoch [%d]\n", vertexIdx, maxEventsPerEpoch, allVerticesDevice->beginTimeHistoryNumElementsInEpoch_[vertexIdx]); + // return; + // } + // int &beginHistoryQueueEnd = allVerticesDevice->beginTimeHistoryBufferEnd_[vertexIdx]; + // allVerticesDevice->beginTimeHistory_[vertexIdx][beginHistoryQueueEnd] = allVerticesDevice->servingCallBufferTime_[vertexIdx][unit]; + // beginHistoryQueueEnd = (beginHistoryQueueEnd + 1) % maxEventsPerEpoch; + // allVerticesDevice->beginTimeHistoryNumElementsInEpoch_[vertexIdx]++; + // // Store answerTimeHistory + // // EventBuffer::insertEvent + // if (allVerticesDevice->answerTimeHistoryNumElementsInEpoch_[vertexIdx] >= maxEventsPerEpoch) { + // printf("ERROR: answerTimeHistory buffer is full. Vertex ID [%d] Buffer size [%d] Number of Elements in Epoch [%d]\n", vertexIdx, maxEventsPerEpoch, allVerticesDevice->answerTimeHistoryNumElementsInEpoch_[vertexIdx]); + // return; + // } + // int &answerHistoryQueueEnd = allVerticesDevice->answerTimeHistoryBufferEnd_[vertexIdx]; + // allVerticesDevice->answerTimeHistory_[vertexIdx][answerHistoryQueueEnd] = allVerticesDevice->answerTime_[vertexIdx][unit]; + // answerHistoryQueueEnd = (answerHistoryQueueEnd + 1) % maxEventsPerEpoch; + // allVerticesDevice->answerTimeHistoryNumElementsInEpoch_[vertexIdx]++; + // // Store endTimeHistory + // // EventBuffer::insertEvent + // if (allVerticesDevice->endTimeHistoryNumElementsInEpoch_[vertexIdx] >= maxEventsPerEpoch) { + // printf("ERROR: endTimeHistory buffer is full. Vertex ID [%d] Buffer size [%d] Number of Elements in Epoch [%d]\n", vertexIdx, maxEventsPerEpoch, allVerticesDevice->endTimeHistoryNumElementsInEpoch_[vertexIdx]); + // return; + // } + // int &endHistoryQueueEnd = allVerticesDevice->endTimeHistoryBufferEnd_[vertexIdx]; + // allVerticesDevice->endTimeHistory_[vertexIdx][endHistoryQueueEnd] = simulationStep; + // endHistoryQueueEnd = (endHistoryQueueEnd + 1) % maxEventsPerEpoch; + // allVerticesDevice->endTimeHistoryNumElementsInEpoch_[vertexIdx]++; + + // // Unit is added to available units + // availableUnits[unit] = true; + // numberOfAvailableUnits++; + // } + int countdown = allVerticesDevice->serverCountdown_[vertexIdx][unit]; + // Check if countdown was already 0 + int countdownWasZero = countdown == 0; + + // Decrement if it was not already 0 + countdown -= (1 - countdownWasZero); + allVerticesDevice->serverCountdown_[vertexIdx][unit] = countdown; + + // Countdown became zero after decrement so unit is becoming available + //int countdownNowZero = countdown == 0; + + // Set the available unit if it was already available or became available + availableUnits[unit] = (unsigned char)(countdown == 0); + numberOfAvailableUnits += (countdown == 0); + + // If it became zero, the unit responds to the new incident + //int countdownBecameZero = (!countdownWasZero) & countdownNowZero; + if ((!countdownWasZero) & (countdown == 0)) { + // Unit becomes available to responde to new incidents + + //Store incident response metrics + // Store wasAbandonedHistory + // EventBuffer::insertEvent + if (allVerticesDevice->wasAbandonedHistoryNumElementsInEpoch_[vertexIdx] + >= maxEventsPerEpoch) { + printf( + "ERROR: wasAbandonHistory buffer is full. Vertex ID [%d] Buffer size [%d] Number of Elements in Epoch [%d]\n", + vertexIdx, maxEventsPerEpoch, + allVerticesDevice->wasAbandonedHistoryNumElementsInEpoch_[vertexIdx]); + return; + } + int &abandonedHistoryQueueEnd + = allVerticesDevice->wasAbandonedHistoryBufferEnd_[vertexIdx]; + allVerticesDevice->wasAbandonedHistory_[vertexIdx][abandonedHistoryQueueEnd] = false; + abandonedHistoryQueueEnd = (abandonedHistoryQueueEnd + 1) % maxEventsPerEpoch; + allVerticesDevice->wasAbandonedHistoryNumElementsInEpoch_[vertexIdx]++; + // Store beginTimeHistory + // EventBuffer::insertEvent + if (allVerticesDevice->beginTimeHistoryNumElementsInEpoch_[vertexIdx] + >= maxEventsPerEpoch) { + printf( + "ERROR: beginTimeHistory buffer is full. Vertex ID [%d] Buffer size [%d] Number of Elements in Epoch [%d]\n", + vertexIdx, maxEventsPerEpoch, + allVerticesDevice->beginTimeHistoryNumElementsInEpoch_[vertexIdx]); + return; + } + int &beginHistoryQueueEnd = allVerticesDevice->beginTimeHistoryBufferEnd_[vertexIdx]; + allVerticesDevice->beginTimeHistory_[vertexIdx][beginHistoryQueueEnd] + = allVerticesDevice->servingCallBufferTime_[vertexIdx][unit]; + beginHistoryQueueEnd = (beginHistoryQueueEnd + 1) % maxEventsPerEpoch; + allVerticesDevice->beginTimeHistoryNumElementsInEpoch_[vertexIdx]++; + // Store answerTimeHistory + // EventBuffer::insertEvent + if (allVerticesDevice->answerTimeHistoryNumElementsInEpoch_[vertexIdx] + >= maxEventsPerEpoch) { + printf( + "ERROR: answerTimeHistory buffer is full. Vertex ID [%d] Buffer size [%d] Number of Elements in Epoch [%d]\n", + vertexIdx, maxEventsPerEpoch, + allVerticesDevice->answerTimeHistoryNumElementsInEpoch_[vertexIdx]); + return; + } + int &answerHistoryQueueEnd = allVerticesDevice->answerTimeHistoryBufferEnd_[vertexIdx]; + allVerticesDevice->answerTimeHistory_[vertexIdx][answerHistoryQueueEnd] + = allVerticesDevice->answerTime_[vertexIdx][unit]; + answerHistoryQueueEnd = (answerHistoryQueueEnd + 1) % maxEventsPerEpoch; + allVerticesDevice->answerTimeHistoryNumElementsInEpoch_[vertexIdx]++; + // Store endTimeHistory + // EventBuffer::insertEvent + if (allVerticesDevice->endTimeHistoryNumElementsInEpoch_[vertexIdx] >= maxEventsPerEpoch) { + printf( + "ERROR: endTimeHistory buffer is full. Vertex ID [%d] Buffer size [%d] Number of Elements in Epoch [%d]\n", + vertexIdx, maxEventsPerEpoch, + allVerticesDevice->endTimeHistoryNumElementsInEpoch_[vertexIdx]); + return; + } + int &endHistoryQueueEnd = allVerticesDevice->endTimeHistoryBufferEnd_[vertexIdx]; + allVerticesDevice->endTimeHistory_[vertexIdx][endHistoryQueueEnd] = simulationStep; + endHistoryQueueEnd = (endHistoryQueueEnd + 1) % maxEventsPerEpoch; + allVerticesDevice->endTimeHistoryNumElementsInEpoch_[vertexIdx]++; + } + } + + + // Assign reponse dispatches until no units are available or there are no more + // incidents in the waiting queue + //uint64_t queueFrontIndex = allVerticesDevice->vertexQueuesFront_[vertexIdx]; + uint64_t &queueEndIndex = allVerticesDevice->vertexQueuesEnd_[vertexIdx]; + for (size_t unit = 0; unit < numberOfAvailableUnits + && !(allVerticesDevice->vertexQueuesFront_[vertexIdx] == queueEndIndex); + ++unit) { + int incidentId = allVerticesDevice->vertexQueuesBufferVertexId_[vertexIdx][queueEndIndex]; + uint64_t incidentTime = allVerticesDevice->vertexQueuesBufferTime_[vertexIdx][queueEndIndex]; + int incidentDuration + = allVerticesDevice->vertexQueuesBufferDuration_[vertexIdx][queueEndIndex]; + BGFLOAT incidentX = allVerticesDevice->vertexQueuesBufferX_[vertexIdx][queueEndIndex]; + BGFLOAT incidentY = allVerticesDevice->vertexQueuesBufferY_[vertexIdx][queueEndIndex]; + int incidentPatience + = allVerticesDevice->vertexQueuesBufferPatience_[vertexIdx][queueEndIndex]; + int incidentOnSiteTime + = allVerticesDevice->vertexQueuesBufferOnSiteTime_[vertexIdx][queueEndIndex]; + int incidentResponderType + = allVerticesDevice->vertexQueuesBufferResponderType_[vertexIdx][queueEndIndex]; + queueEndIndex = (queueEndIndex + 1) % (allVerticesDevice->numTrunks_[vertexIdx] + 1); + + // The available unit starts serving the call + int availUnit = -1; + // for(BGSIZE unitIndex = 0; unitIndex < numberOfUnits; unitIndex++) { + // if (availableUnits[unitIndex] == true) { + // // If server is available, have that server serve the call + // availUnit = unitIndex; + // availableUnits[unitIndex] = false; + // break; + // } + // } + for (BGSIZE unitIndex = 0; unitIndex < allVerticesDevice->numServers_[vertexIdx]; + unitIndex++) { + //int unitIsAvailable = availableUnits[unitIndex] == true; + //int unitNotFound = availUnit == -1; + // Add 0 if unit is not available or 1 + unitIndex if it's available and a unit has not already been found + availUnit += (availableUnits[unitIndex] == true && availUnit == -1) * (unitIndex + 1); + // Flip value only if the unit is available and a unit has not been found + availableUnits[unitIndex] + = (unsigned char)(availableUnits[unitIndex] + == true - (availableUnits[unitIndex] == true && availUnit == -1)); + } + allVerticesDevice->servingCallBufferVertexId_[vertexIdx][availUnit] = incidentId; + allVerticesDevice->servingCallBufferTime_[vertexIdx][availUnit] = incidentTime; + allVerticesDevice->servingCallBufferDuration_[vertexIdx][availUnit] = incidentDuration; + allVerticesDevice->servingCallBufferX_[vertexIdx][availUnit] = incidentX; + allVerticesDevice->servingCallBufferY_[vertexIdx][availUnit] = incidentY; + allVerticesDevice->servingCallBufferPatience_[vertexIdx][availUnit] = incidentPatience; + allVerticesDevice->servingCallBufferOnSiteTime_[vertexIdx][availUnit] = incidentOnSiteTime; + allVerticesDevice->servingCallBufferResponderType_[vertexIdx][availUnit] + = incidentResponderType; + + allVerticesDevice->answerTime_[vertexIdx][availUnit] = simulationStep; + + // We need to calculate the distance in miles but the x and y coordinates + // represent, respectively, degrees of longitude and latitude. + // One degree of latitude is aproximately 69 miles regardles of the location. However, + // a degree of longitude varies, being 69.172 miles at the equator and gradually shrinking + // to zero at the poles. + // One degree of longitude can be converted to miles using the following formula: + // 1 degree of longitude = cos(latitude) * 69.172 + // BGFLOAT lngDegreeLength = cos(yLocation[vertexIdx] * (pi / 180)) * 69.172f; + // BGFLOAT latDegreeLength = 69.0; + // BGFLOAT deltaLng = incidentX - xLocation[vertexIdx]; + // BGFLOAT deltaLat = incidentY - yLocation[vertexIdx]; + // BGFLOAT dist2incident + // = sqrtf(powf(incidentX - xLocation[vertexIdx] * cos(yLocation[vertexIdx] * (pi / 180)) * 69.172f, 2) + powf(incidentY - yLocation[vertexIdx] * 69.0f, 2)); + + // Calculate the driving time to the incident in seconds + // BGFLOAT driveTime = (dist2incident / drivingSpeed) * 3600; + // allVerticesDevice->serverCountdown_[vertexIdx][availUnit] = driveTime + incidentOnSiteTime; + + /// Wouldn't this just immediately overwrite the above? Why is it needed? + allVerticesDevice->serverCountdown_[vertexIdx][availUnit] = incidentDuration; + } + + // Update number of busy servers. This is used to check if there is space in the queue + allVerticesDevice->busyServers_[vertexIdx] + = allVerticesDevice->numServers_[vertexIdx] - numberOfAvailableUnits; + + // Update queueLength and utilization histories + // // Compute the size of the destination queue for queue length + // uint64_t queueSize; + // // if (queueFrontIndex >= queueEndIndex) { + // // queueSize = queueFrontIndex - queueEndIndex; + // // } else { + // // queueSize = stepsPerEpoch + queueFrontIndex - queueEndIndex; + // // } + // queueSize = stepsPerEpoch * (1 - queueFrontIndex >= queueEndIndex) + queueFrontIndex - queueEndIndex; + // EventBuffer::insertEvent + if (allVerticesDevice->queueLengthHistoryNumElementsInEpoch_[vertexIdx] >= stepsPerEpoch) { + printf("ERROR: queueLengthHistory buffer is full. Vertex ID [%d] Buffer size [%" PRIu64 + "] Number of Elements in Epoch [%d]\n", + vertexIdx, stepsPerEpoch, + allVerticesDevice->queueLengthHistoryNumElementsInEpoch_[vertexIdx]); + return; + } + int &queueLengthHistoryQueueEnd = allVerticesDevice->queueLengthHistoryBufferEnd_[vertexIdx]; + allVerticesDevice->queueLengthHistory_[vertexIdx][queueLengthHistoryQueueEnd] + = stepsPerEpoch * (1 - (allVerticesDevice->vertexQueuesFront_[vertexIdx] >= queueEndIndex)) + + allVerticesDevice->vertexQueuesFront_[vertexIdx] - queueEndIndex; + queueLengthHistoryQueueEnd = (queueLengthHistoryQueueEnd + 1) % stepsPerEpoch; + allVerticesDevice->queueLengthHistoryNumElementsInEpoch_[vertexIdx]++; + // EventBuffer::insertEvent + if (allVerticesDevice->utilizationHistoryNumElementsInEpoch_[vertexIdx] >= stepsPerEpoch) { + printf("ERROR: utilizationHistory buffer is full. Vertex ID [%d] Buffer size [%" PRIu64 + "] Number of Elements in Epoch [%d]\n", + vertexIdx, stepsPerEpoch, + allVerticesDevice->utilizationHistoryNumElementsInEpoch_[vertexIdx]); + return; + } + int &utilizationHistoryQueueEnd = allVerticesDevice->utilizationHistoryBufferEnd_[vertexIdx]; + allVerticesDevice->utilizationHistory_[vertexIdx][utilizationHistoryQueueEnd] + = static_cast(allVerticesDevice->busyServers_[vertexIdx]) + / allVerticesDevice->numServers_[vertexIdx]; + utilizationHistoryQueueEnd = (utilizationHistoryQueueEnd + 1) % stepsPerEpoch; + allVerticesDevice->utilizationHistoryNumElementsInEpoch_[vertexIdx]++; + + // Free the availableUnits array + free(availableUnits); +} + +/// Take a call from an edge and add it to the queue if the queue isn't full. +/// +/// @param allVerticesDevice GPU address of the allVertices struct on device memory. +/// @param edgeIndexMapDevice GPU address of the EdgeIndexMap on device memory. +/// @param allEdgesDevice GPU address of the allEdges struct on device memory. +void All911Vertices::integrateVertexInputs(void *allVerticesDevice, + EdgeIndexMapDevice *edgeIndexMapDevice, + void *allEdgesDevice) +{ + // CUDA parameters + Simulator &simulator = Simulator::getInstance(); + int totalVertices = simulator.getTotalVertices(); + const int threadsPerBlock = 256; + int blocksPerGrid = (totalVertices + threadsPerBlock - 1) / threadsPerBlock; + uint64_t stepsPerEpoch = simulator.getEpochDuration() / simulator.getDeltaT(); + + maybeTakeCallFromEdge<<>>( + totalVertices, stepsPerEpoch, (All911VerticesDeviceProperties *)allVerticesDevice, + (All911EdgesDeviceProperties *)allEdgesDevice, edgeIndexMapDevice); + cudaDeviceSynchronize(); +} + +__global__ void maybeTakeCallFromEdge(int totalVertices, uint64_t stepsPerEpoch, + All911VerticesDeviceProperties *allVerticesDevice, + All911EdgesDeviceProperties *allEdgesDevice, + EdgeIndexMapDevice *edgeIndexMapDevice) +{ + // The usual thread ID calculation and guard against excess threads + // (beyond the number of vertices, in this case). + int idx = blockIdx.x * blockDim.x + threadIdx.x; + if (idx >= totalVertices) + return; + + // TODO911: Caller Regions will have different behaviour + if (allVerticesDevice->vertexType_[idx] == 3) { + return; + } + + // Loop over all the edges and pull the data in + for (int edge = edgeIndexMapDevice->incomingEdgeBegin_[idx]; + edge + < edgeIndexMapDevice->incomingEdgeBegin_[idx] + edgeIndexMapDevice->incomingEdgeCount_[idx]; + ++edge) { + int edgeIdx = edgeIndexMapDevice->incomingEdgeIndexMap_[edge]; + + // if (!allEdgesDevice->inUse_[edgeIdx]) { + // continue; + // } // Edge isn't in use + // if (allEdgesDevice->isAvailable_[edgeIdx]) { + // continue; + // } // Edge doesn't have a call + if (!allEdgesDevice->inUse_[edgeIdx] || allEdgesDevice->isAvailable_[edgeIdx]) { + continue; // Edge isn't in use and doesn't have a call + } + + int dstIndex = allEdgesDevice->destVertexIndex_[edgeIdx]; + // The destination vertex should be the one pulling the information + if (dstIndex != idx) { + printf( + "ERROR: The destination vertex is responsible for pulling in it's calls. Destination Vertex ID [%d] Vertex ID [%d]\n", + dstIndex, idx); + return; + } + + // Compute the size of the destination queue + uint64_t dstQueueSize; + uint64_t queueFrontIndex = allVerticesDevice->vertexQueuesFront_[dstIndex]; + uint64_t queueEndIndex = allVerticesDevice->vertexQueuesEnd_[dstIndex]; + if (queueFrontIndex >= queueEndIndex) { + dstQueueSize = queueFrontIndex - queueEndIndex; + } else { + dstQueueSize + = allVerticesDevice->numTrunks_[dstIndex] + 1 + queueFrontIndex - queueEndIndex; + } + //dstQueueSize = (1 - (queueFrontIndex >= allVerticesDevice->vertexQueuesEnd_[dstIndex])) * (allVerticesDevice->numTrunks_[dstIndex] + 1) + queueFrontIndex - allVerticesDevice->vertexQueuesEnd_[dstIndex]; + + // Compute the capacity of the destination queue + int dstQueueCapacity = allVerticesDevice->numTrunks_[dstIndex]; + + // Get the number fo busy servers at the destination vertex + int dstBusyServers = allVerticesDevice->busyServers_[dstIndex]; + + // Size can't be negative but we need to be able to compare it to a possible negative waiting queue + // so cast the size to an int for comparison + if ((int)dstQueueSize >= (dstQueueCapacity - dstBusyServers)) { + // Call is dropped because there is no space in the waiting queue + if (!allEdgesDevice->isRedial_[edgeIdx]) { + // Only count the dropped call if it's not a redial + allVerticesDevice->droppedCalls_[dstIndex]++; + // Record that we received a call + allVerticesDevice->receivedCalls_[dstIndex]++; + } + } else { + // Transfer call to destination + // We throw an error if the buffer is full + if (((queueFrontIndex + 1) % (allVerticesDevice->numTrunks_[dstIndex] + 1)) + == queueEndIndex) { + printf("ERROR: Vertex queue is full. Vertex ID [%d] Front Index [%" PRIu64 + "] End Index [%" PRIu64 "] Buffer size [%" PRIu64 "]\n", + dstIndex, queueFrontIndex, queueEndIndex, + (allVerticesDevice->numTrunks_[dstIndex] + 1)); + return; + } + // Insert the new element and increment the front index + allVerticesDevice->vertexQueuesBufferVertexId_[dstIndex][queueFrontIndex] + = allEdgesDevice->vertexId_[edgeIdx]; + allVerticesDevice->vertexQueuesBufferTime_[dstIndex][queueFrontIndex] + = allEdgesDevice->time_[edgeIdx]; + allVerticesDevice->vertexQueuesBufferDuration_[dstIndex][queueFrontIndex] + = allEdgesDevice->duration_[edgeIdx]; + allVerticesDevice->vertexQueuesBufferX_[dstIndex][queueFrontIndex] + = allEdgesDevice->x_[edgeIdx]; + allVerticesDevice->vertexQueuesBufferY_[dstIndex][queueFrontIndex] + = allEdgesDevice->y_[edgeIdx]; + allVerticesDevice->vertexQueuesBufferPatience_[dstIndex][queueFrontIndex] + = allEdgesDevice->patience_[edgeIdx]; + allVerticesDevice->vertexQueuesBufferOnSiteTime_[dstIndex][queueFrontIndex] + = allEdgesDevice->onSiteTime_[edgeIdx]; + allVerticesDevice->vertexQueuesBufferResponderType_[dstIndex][queueFrontIndex] + = allEdgesDevice->responderType_[edgeIdx]; + allVerticesDevice->vertexQueuesFront_[dstIndex] + = (queueFrontIndex + 1) % (allVerticesDevice->numTrunks_[dstIndex] + 1); + // Record that we received a call + allVerticesDevice->receivedCalls_[dstIndex]++; + allEdgesDevice->isAvailable_[edgeIdx] = true; + allEdgesDevice->isRedial_[edgeIdx] = false; + } + // int queueFull = (int)((1 - (queueFrontIndex >= allVerticesDevice->vertexQueuesEnd_[dstIndex])) * (allVerticesDevice->numTrunks_[dstIndex] + 1) + queueFrontIndex - allVerticesDevice->vertexQueuesEnd_[dstIndex]) >= (allVerticesDevice->numTrunks_[dstIndex] - allVerticesDevice->busyServers_[dstIndex]); + // allVerticesDevice->droppedCalls_[dstIndex] += queueFull && (!allEdgesDevice->isRedial_[edgeIdx]); + // allVerticesDevice->receivedCalls_[dstIndex] += queueFull && (!allEdgesDevice->isRedial_[edgeIdx]); + // if (!queueFull) { + // // Transfer call to destination + // // We throw an error if the buffer is full + // if (((queueFrontIndex + 1) % (allVerticesDevice->numTrunks_[dstIndex] + 1)) == allVerticesDevice->vertexQueuesEnd_[dstIndex]) { + // printf("ERROR: Vertex queue is full. Vertex ID [%d] Front Index [%" PRIu64 "] End Index [%" PRIu64 "] Buffer size [%" PRIu64 "]\n", dstIndex, queueFrontIndex, allVerticesDevice->vertexQueuesEnd_[dstIndex], (allVerticesDevice->numTrunks_[dstIndex] + 1)); + // return; + // } + // // Insert the new element and increment the front index + // allVerticesDevice->vertexQueuesBufferVertexId_[dstIndex][queueFrontIndex] = allEdgesDevice->vertexId_[edgeIdx]; + // allVerticesDevice->vertexQueuesBufferTime_[dstIndex][queueFrontIndex] = allEdgesDevice->time_[edgeIdx]; + // allVerticesDevice->vertexQueuesBufferDuration_[dstIndex][queueFrontIndex] = allEdgesDevice->duration_[edgeIdx]; + // allVerticesDevice->vertexQueuesBufferX_[dstIndex][queueFrontIndex] = allEdgesDevice->x_[edgeIdx]; + // allVerticesDevice->vertexQueuesBufferY_[dstIndex][queueFrontIndex] = allEdgesDevice->y_[edgeIdx]; + // allVerticesDevice->vertexQueuesBufferPatience_[dstIndex][queueFrontIndex] = allEdgesDevice->patience_[edgeIdx]; + // allVerticesDevice->vertexQueuesBufferOnSiteTime_[dstIndex][queueFrontIndex] = allEdgesDevice->onSiteTime_[edgeIdx]; + // allVerticesDevice->vertexQueuesBufferResponderType_[dstIndex][queueFrontIndex] = allEdgesDevice->responderType_[edgeIdx]; + // allVerticesDevice->vertexQueuesFront_[dstIndex] = (queueFrontIndex + 1) % (allVerticesDevice->numTrunks_[dstIndex] + 1); + // // Record that we received a call + // allVerticesDevice->receivedCalls_[dstIndex]++; + // allEdgesDevice->isAvailable_[edgeIdx] = true; + // allEdgesDevice->isRedial_[edgeIdx] = false; + // } + } +} + +void All911Vertices::clearVertexHistory(void *allVerticesDevice) +{ + /// What exactly should this clear out? Probably at least the vertex queues + All911VerticesDeviceProperties allVertices; + HANDLE_ERROR(cudaMemcpy(&allVertices, allVerticesDevice, sizeof(All911VerticesDeviceProperties), + cudaMemcpyDeviceToHost)); + + int numberOfVertices = Simulator::getInstance().getTotalVertices(); + // uint64_t **beginTimeHistory_ + HANDLE_ERROR(cudaMemset(allVertices.beginTimeHistoryNumElementsInEpoch_, 0, + numberOfVertices * sizeof(int))); + { + vector epochStart(numberOfVertices); + for (int i = 0; i < epochStart.size(); ++i) { + epochStart[i] = beginTimeHistory_[i].getBufferEnd(); + } + HANDLE_ERROR(cudaMemcpy(allVertices.beginTimeHistoryEpochStart_, epochStart.data(), + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + } + // uint64_t **answerTimeHistory_ + HANDLE_ERROR(cudaMemset(allVertices.answerTimeHistoryNumElementsInEpoch_, 0, + numberOfVertices * sizeof(int))); + { + vector epochStart(numberOfVertices); + for (int i = 0; i < epochStart.size(); ++i) { + epochStart[i] = answerTimeHistory_[i].getBufferEnd(); + } + HANDLE_ERROR(cudaMemcpy(allVertices.answerTimeHistoryEpochStart_, epochStart.data(), + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + } + // uint64_t **endTimeHistory_ + HANDLE_ERROR( + cudaMemset(allVertices.endTimeHistoryNumElementsInEpoch_, 0, numberOfVertices * sizeof(int))); + { + vector epochStart(numberOfVertices); + for (int i = 0; i < epochStart.size(); ++i) { + epochStart[i] = endTimeHistory_[i].getBufferEnd(); + } + HANDLE_ERROR(cudaMemcpy(allVertices.endTimeHistoryEpochStart_, epochStart.data(), + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + } + // uint64_t **wasAbandonedHistory_ + HANDLE_ERROR(cudaMemset(allVertices.wasAbandonedHistoryNumElementsInEpoch_, 0, + numberOfVertices * sizeof(int))); + { + vector epochStart(numberOfVertices); + for (int i = 0; i < epochStart.size(); ++i) { + epochStart[i] = wasAbandonedHistory_[i].getBufferEnd(); + } + HANDLE_ERROR(cudaMemcpy(allVertices.wasAbandonedHistoryEpochStart_, epochStart.data(), + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + } + // uint64_t **queueLengthHistory_ + HANDLE_ERROR(cudaMemset(allVertices.queueLengthHistoryNumElementsInEpoch_, 0, + numberOfVertices * sizeof(int))); + { + vector epochStart(numberOfVertices); + for (int i = 0; i < epochStart.size(); ++i) { + epochStart[i] = queueLengthHistory_[i].getBufferEnd(); + } + HANDLE_ERROR(cudaMemcpy(allVertices.queueLengthHistoryEpochStart_, epochStart.data(), + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + } + // BGFLOAT **utilizationHistory_ + HANDLE_ERROR(cudaMemset(allVertices.utilizationHistoryNumElementsInEpoch_, 0, + numberOfVertices * sizeof(int))); + { + vector epochStart(numberOfVertices); + for (int i = 0; i < epochStart.size(); ++i) { + epochStart[i] = utilizationHistory_[i].getBufferEnd(); + } + HANDLE_ERROR(cudaMemcpy(allVertices.utilizationHistoryEpochStart_, epochStart.data(), + numberOfVertices * sizeof(int), cudaMemcpyHostToDevice)); + } +} + +/// Copies all inputs scheduled to occur in the upcoming epoch onto device. +void All911Vertices::copyEpochInputsToDevice() +{ + LOG4CPLUS_DEBUG(fileLogger_, "Calling All911Vertices::copyEpochInputsToDevice"); + // The only new inputs are going to be for caller region vertices. However, due to how + // we have our memory organized on the GPU, we need to copy over all queues instead of + // just the queues with new inputs. + All911VerticesDeviceProperties allVertices; + Simulator &simulator = Simulator::getInstance(); + int numberOfVertices = simulator.getTotalVertices(); + uint64_t stepsPerEpoch = simulator.getEpochDuration() / simulator.getDeltaT(); + GPUModel *gpuModel = static_cast(&(simulator.getModel())); + void *deviceAddress = static_cast(gpuModel->getAllVerticesDevice()); + HANDLE_ERROR(cudaMemcpy(&allVertices, deviceAddress, sizeof(All911VerticesDeviceProperties), + cudaMemcpyDeviceToHost)); + copyVertexQueuesToDevice(numberOfVertices, stepsPerEpoch, allVertices); +} + +void All911Vertices::setAdvanceVerticesDeviceParams(AllEdges &edges) +{ + LOG4CPLUS_DEBUG(vertexLogger_, "Setting Advance Vertices device parameters"); +} + +int All911Vertices::getNumberOfVerticesNeedingDeviceNoise() const +{ + return numberOfVerticesNeedingDeviceNoise_; +} \ No newline at end of file diff --git a/Simulator/Vertices/Neuro/AllSpikingNeurons_d.cpp b/Simulator/Vertices/Neuro/AllSpikingNeurons_d.cpp index 9a3602ec6..b1201ac26 100644 --- a/Simulator/Vertices/Neuro/AllSpikingNeurons_d.cpp +++ b/Simulator/Vertices/Neuro/AllSpikingNeurons_d.cpp @@ -138,14 +138,14 @@ void AllSpikingNeurons::copyFromDevice() uint64_t *pSpikeHistory[numVertices]; HANDLE_ERROR(cudaMemcpy(pSpikeHistory, allVerticesDevice.spikeHistory_, - numVertices * sizeof(uint64_t), cudaMemcpyDeviceToHost)); + numVertices * sizeof(uint64_t *), cudaMemcpyDeviceToHost)); // All EventBuffers are of the same size, // which is one greater than maxSpikes in GPU spikeHistory array. int maxSpikes = vertexEvents_[0].size(); for (int i = 0; i < numVertices; i++) { HANDLE_ERROR(cudaMemcpy(vertexEvents_[i].data(), pSpikeHistory[i], - maxSpikes * sizeof(uint64_t *), cudaMemcpyDeviceToHost)); + maxSpikes * sizeof(uint64_t), cudaMemcpyDeviceToHost)); } } diff --git a/Testing/RegressionTesting/GoodOutput/Cpu/test-small-911-out.xml b/Testing/RegressionTesting/GoodOutput/Cpu/test-small-911-out.xml index 173c25fd2..13cb42ada 100644 Binary files a/Testing/RegressionTesting/GoodOutput/Cpu/test-small-911-out.xml and b/Testing/RegressionTesting/GoodOutput/Cpu/test-small-911-out.xml differ diff --git a/Testing/RegressionTesting/GoodOutput/Gpu/test-small-911-out.xml b/Testing/RegressionTesting/GoodOutput/Gpu/test-small-911-out.xml new file mode 100644 index 000000000..13cb42ada --- /dev/null +++ b/Testing/RegressionTesting/GoodOutput/Gpu/test-small-911-out.xml @@ -0,0 +1,196 @@ + + + 5 10 10 10 10 10 5 10 10 10 0 + + + 4 5 3 3 3 3 3 4 5 3 0 + + + 1 0 0 0 0 0 0 0 0 0 0 + + + 21 2 3 1 2 2 1 1 5 2 0 + + + 37 73 47 34 42 388 130 435 401 324 490 541 900 960 671 1110 1106 1155 1143 1009 + + + 265 512 + + + 490 1061 1337 + + + 213 + + + 434 + + + 450 750 + + + 1014 + + + 892 + + + 207 370 982 1175 1385 + + + 534 1355 + + + 38 0 48 35 43 389 208 436 402 325 491 542 901 961 672 1111 1107 1175 1144 1010 + + + 266 513 + + + 491 1062 1338 + + + 214 + + + 435 + + + 451 751 + + + 1015 + + + 893 + + + 208 371 983 1176 1386 + + + 535 1356 + + + 207 0 213 265 370 434 450 490 512 534 750 892 982 1014 1061 1175 1337 1355 1385 1648 + + + 496 623 + + + 545 1451 1568 + + + 379 + + + 480 + + + 693 1010 + + + 1068 + + + 1243 + + + 377 698 1064 1240 1627 + + + 744 1536 + + + 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + + + 0 0 + + + 0 0 0 + + + 0 + + + 0 + + + 0 0 + + + 0 + + + 0 + + + 0 0 0 0 0 + + + 0 0 + + + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + + + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + + + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + + + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + + + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + + + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + + + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + + + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + + + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + + + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + + + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0.25 0.25 0.5 0.5 0.5 0.5 0.5 0.75 0.75 0.75 0.75 0.75 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0.75 0.75 1 1 1 1 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0.75 0.75 0.75 1 1 1 1 1 1 1 1 1 1 1 1 1 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.5 0.5 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.75 0.75 0.75 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.5 0.5 0.5 0.5 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0.75 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + + + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + + + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + + + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + + + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 + + + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + + + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + + + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + + + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.4 0.4 0.4 0.4 0.4 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + + + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0.333333 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + + + 4 5 5 5 7 7 7 7 6 6 3 + diff --git a/Testing/RegressionTesting/GoodOutput/Gpu/test-tiny-out.xml b/Testing/RegressionTesting/GoodOutput/Gpu/test-tiny-out.xml index c58de253d..2bee30482 100644 --- a/Testing/RegressionTesting/GoodOutput/Gpu/test-tiny-out.xml +++ b/Testing/RegressionTesting/GoodOutput/Gpu/test-tiny-out.xml @@ -1,4 +1,7 @@ + + 5738 8228 + 2 1 2 2 diff --git a/Testing/RegressionTesting/configfiles/test-medium-911.xml b/Testing/RegressionTesting/configfiles/test-medium-911.xml new file mode 100644 index 000000000..3abb8e2a0 --- /dev/null +++ b/Testing/RegressionTesting/configfiles/test-medium-911.xml @@ -0,0 +1,51 @@ + + + + + + 200 + 1440 + + 1 + + + 100 + + 190 + + + 1 + 1 + + + + + + 0.85 + + 30.0 + + + + + + + ../configfiles/graphs/test-medium-911.graphml + 0 + 0 + + + + ../configfiles/inputs/test-medium-911-calls.xml + + + + + + + + ../Testing/RegressionTesting/TestOutput/test-medium-911-out.xml + + + + diff --git a/Testing/RunTests.sh b/Testing/RunTests.sh index 20057a9a2..00b7c655b 100644 --- a/Testing/RunTests.sh +++ b/Testing/RunTests.sh @@ -79,7 +79,8 @@ else "test-medium" "test-medium-connected" "test-medium-long" - "test-medium-connected-long") + "test-medium-connected-long" + "test-small-911") fi # This function starts the simulations in parallel diff --git a/Testing/UnitTesting/InputManagerTests.cpp b/Testing/UnitTesting/InputManagerTests.cpp index 9ad1381fa..5230fdc56 100644 --- a/Testing/UnitTesting/InputManagerTests.cpp +++ b/Testing/UnitTesting/InputManagerTests.cpp @@ -191,4 +191,9 @@ TEST(InputManager, readNeuroInputs) ASSERT_EQ(inputManager.getClockTickSize(), 100); ASSERT_EQ(inputManager.getClockTickUnit(), "usec"); +} + +TEST_F(InputManagerFixture, totalNumberOfEvents) +{ + ASSERT_EQ(inputManager.getTotalNumberOfEvents(), 8); } \ No newline at end of file diff --git a/Testing/UnitTesting/OperationManagerTestingClass.h b/Testing/UnitTesting/OperationManagerTestingClass.h index 3527cb988..cc453986d 100644 --- a/Testing/UnitTesting/OperationManagerTestingClass.h +++ b/Testing/UnitTesting/OperationManagerTestingClass.h @@ -37,6 +37,12 @@ class Foo : public IFoo { { cout << "Foo printing parameters" << endl; } + + void loadEpochInputs(uint64_t currentStep, uint64_t endStep) + { + cout << "Foo current step: " << currentStep << endl; + cout << "Foo end step: " << endStep << endl; + } }; diff --git a/Testing/UnitTesting/OperationManagerTests.cpp b/Testing/UnitTesting/OperationManagerTests.cpp index 0a54afb90..433e4a0ab 100644 --- a/Testing/UnitTesting/OperationManagerTests.cpp +++ b/Testing/UnitTesting/OperationManagerTests.cpp @@ -48,4 +48,21 @@ TEST(OperationManager, OperationExecutionSuccess) TEST(OperationManager, OperationExecutionContainsNoFunctionsOfOperationType) { EXPECT_NO_FATAL_FAILURE(OperationManager::getInstance().executeOperation(Operations::copyToGPU)); +} + +TEST(OperationManager, AddingNonEmptySignatureOperation) +{ + Foo foo; + function function + = std::bind(&Foo::loadEpochInputs, foo, std::placeholders::_1, std::placeholders::_2); + EXPECT_NO_FATAL_FAILURE( + OperationManager::getInstance().registerOperation(Operations::loadEpochInputs, function)); +} + +TEST(OperationManager, NonEmptySignatureOperationExecution) +{ + uint64_t currentStep = 10; + uint64_t endStep = 20; + EXPECT_NO_FATAL_FAILURE(OperationManager::getInstance().executeOperation( + Operations::loadEpochInputs, currentStep, endStep)); } \ No newline at end of file diff --git a/configfiles/graphs/test-medium-911.graphml b/configfiles/graphs/test-medium-911.graphml new file mode 100644 index 000000000..d86a3e791 --- /dev/null +++ b/configfiles/graphs/test-medium-911.graphml @@ -0,0 +1,21160 @@ + + + + + + + + + + + + + PSAP + PSAP_920@GraphGeneration.gov + PSAP_920 + 6 + 3 + 118.36261166039608 + 102.25562765898832 + + + PSAP + PSAP_1012@GraphGeneration.gov + PSAP_1012 + 5 + 3 + 190.74906276676657 + 112.81476824519619 + + + PSAP + PSAP_1564@GraphGeneration.gov + PSAP_1564 + 10 + 3 + 185.00640471230477 + 155.24513553065935 + + + PSAP + PSAP_1656@GraphGeneration.gov + PSAP_1656 + 5 + 3 + 14.066553219857319 + 186.08742555861383 + + + PSAP + PSAP_1748@GraphGeneration.gov + PSAP_1748 + 5 + 3 + 122.41127934141082 + 189.8837772694578 + + + PSAP + PSAP_1840@GraphGeneration.gov + PSAP_1840 + 10 + 3 + 161.73869925694777 + 174.44284578967088 + + + PSAP + PSAP_0@GraphGeneration.gov + PSAP_0 + 6 + 4 + 53.48105053685491 + 5.539701726084953 + + + PSAP + PSAP_276@GraphGeneration.gov + PSAP_276 + 6 + 4 + 40.59297197927873 + 32.545267191775146 + + + PSAP + PSAP_460@GraphGeneration.gov + PSAP_460 + 6 + 4 + 162.1606566813899 + 55.5315744963312 + + + PSAP + PSAP_736@GraphGeneration.gov + PSAP_736 + 8 + 4 + 138.59452189729515 + 72.25039517887713 + + + PSAP + PSAP_828@GraphGeneration.gov + PSAP_828 + 8 + 4 + 41.02530208940383 + 97.61170706435864 + + + PSAP + PSAP_1104@GraphGeneration.gov + PSAP_1104 + 9 + 4 + 11.325542760627709 + 132.93888819507154 + + + PSAP + PSAP_1288@GraphGeneration.gov + PSAP_1288 + 10 + 4 + 186.77533039581544 + 121.76822806013962 + + + PSAP + PSAP_92@GraphGeneration.gov + PSAP_92 + 5 + 5 + 124.98584500655676 + 4.5121877609966035 + + + PSAP + PSAP_184@GraphGeneration.gov + PSAP_184 + 10 + 5 + 176.53967467574878 + 13.18920629063176 + + + PSAP + PSAP_368@GraphGeneration.gov + PSAP_368 + 6 + 5 + 129.44018685387505 + 49.63991163021935 + + + PSAP + PSAP_552@GraphGeneration.gov + PSAP_552 + 10 + 5 + 36.2601046004757 + 73.78334131801273 + + + PSAP + PSAP_644@GraphGeneration.gov + PSAP_644 + 10 + 5 + 99.82881503873074 + 79.45386869802095 + + + PSAP + PSAP_1196@GraphGeneration.gov + PSAP_1196 + 9 + 5 + 114.6707888292886 + 130.42276792062492 + + + PSAP + PSAP_1380@GraphGeneration.gov + PSAP_1380 + 5 + 5 + 47.76112741886401 + 162.74619484366235 + + + PSAP + PSAP_1472@GraphGeneration.gov + PSAP_1472 + 5 + 5 + 128.26454380644486 + 146.97958922558072 + + + EMS + EMS_7@GraphGeneration.gov + EMS_7 + 8 + 3 + 45.684330707676956 + 12.395612110915156 + + + EMS + EMS_10@GraphGeneration.gov + EMS_10 + 7 + 3 + 22.956864898372256 + 17.844146242455704 + + + EMS + EMS_12@GraphGeneration.gov + EMS_12 + 7 + 3 + 14.762871896014056 + 8.971618698245686 + + + EMS + EMS_13@GraphGeneration.gov + EMS_13 + 10 + 3 + 40.53672689647039 + 8.528388714664947 + + + EMS + EMS_16@GraphGeneration.gov + EMS_16 + 10 + 3 + 43.56325077273006 + 3.520005126897135 + + + EMS + EMS_20@GraphGeneration.gov + EMS_20 + 9 + 3 + 57.2440107638832 + 27.06326381580841 + + + EMS + EMS_23@GraphGeneration.gov + EMS_23 + 12 + 3 + 18.431061224448783 + 5.961061486355322 + + + EMS + EMS_25@GraphGeneration.gov + EMS_25 + 7 + 3 + 24.631924929543263 + 20.49024459026305 + + + EMS + EMS_27@GraphGeneration.gov + EMS_27 + 6 + 3 + 58.479385048465275 + 0.37459831818182593 + + + EMS + EMS_96@GraphGeneration.gov + EMS_96 + 9 + 3 + 84.843260210541 + 3.714350273417958 + + + EMS + EMS_99@GraphGeneration.gov + EMS_99 + 10 + 3 + 78.22128428916174 + 23.582915422267874 + + + EMS + EMS_101@GraphGeneration.gov + EMS_101 + 12 + 3 + 78.96207734489474 + 16.996627263105076 + + + EMS + EMS_106@GraphGeneration.gov + EMS_106 + 9 + 3 + 103.72980606079773 + 5.747431600121522 + + + EMS + EMS_110@GraphGeneration.gov + EMS_110 + 8 + 3 + 106.84318234431748 + 14.225462553475865 + + + EMS + EMS_111@GraphGeneration.gov + EMS_111 + 6 + 3 + 115.55778364859083 + 10.31443499949693 + + + EMS + EMS_116@GraphGeneration.gov + EMS_116 + 9 + 3 + 133.09110555533607 + 21.317347661580943 + + + EMS + EMS_118@GraphGeneration.gov + EMS_118 + 9 + 3 + 69.06428772266115 + 24.088380503028795 + + + EMS + EMS_119@GraphGeneration.gov + EMS_119 + 11 + 3 + 130.9313426684405 + 26.27231751837203 + + + EMS + EMS_120@GraphGeneration.gov + EMS_120 + 10 + 3 + 82.19961786073488 + 6.292159410746571 + + + EMS + EMS_193@GraphGeneration.gov + EMS_193 + 8 + 3 + 181.21142154190116 + 25.07144615724517 + + + EMS + EMS_194@GraphGeneration.gov + EMS_194 + 10 + 3 + 172.35133559307474 + 2.6492973442644074 + + + EMS + EMS_202@GraphGeneration.gov + EMS_202 + 7 + 3 + 149.85599238374493 + 19.933953930685643 + + + EMS + EMS_205@GraphGeneration.gov + EMS_205 + 12 + 3 + 172.80163262272157 + 23.8359499551767 + + + EMS + EMS_206@GraphGeneration.gov + EMS_206 + 8 + 3 + 196.29141211575723 + 11.67330821155046 + + + EMS + EMS_208@GraphGeneration.gov + EMS_208 + 7 + 3 + 144.95954826063928 + 23.629440594493186 + + + EMS + EMS_296@GraphGeneration.gov + EMS_296 + 6 + 3 + 44.93946797263768 + 38.97082052063458 + + + EMS + EMS_298@GraphGeneration.gov + EMS_298 + 12 + 3 + 29.260961958421024 + 55.14961017059406 + + + EMS + EMS_306@GraphGeneration.gov + EMS_306 + 9 + 3 + 18.802184290892406 + 30.70908033192486 + + + EMS + EMS_371@GraphGeneration.gov + EMS_371 + 9 + 3 + 131.91811306414684 + 29.311477866278313 + + + EMS + EMS_375@GraphGeneration.gov + EMS_375 + 8 + 3 + 118.17763107239139 + 38.791754906443096 + + + EMS + EMS_377@GraphGeneration.gov + EMS_377 + 9 + 3 + 82.51275869446529 + 54.222177871784524 + + + EMS + EMS_378@GraphGeneration.gov + EMS_378 + 11 + 3 + 123.56577434848471 + 46.837343318916886 + + + EMS + EMS_379@GraphGeneration.gov + EMS_379 + 12 + 3 + 87.58858199490182 + 39.804221212257396 + + + EMS + EMS_380@GraphGeneration.gov + EMS_380 + 10 + 3 + 96.7171646533693 + 42.67903583256721 + + + EMS + EMS_386@GraphGeneration.gov + EMS_386 + 9 + 3 + 68.88041878889078 + 38.3536904121872 + + + EMS + EMS_387@GraphGeneration.gov + EMS_387 + 8 + 3 + 102.41610981634291 + 55.32688401602216 + + + EMS + EMS_398@GraphGeneration.gov + EMS_398 + 11 + 3 + 80.70503171039871 + 34.035202553340326 + + + EMS + EMS_462@GraphGeneration.gov + EMS_462 + 6 + 3 + 151.1731988926529 + 35.87907210647247 + + + EMS + EMS_468@GraphGeneration.gov + EMS_468 + 7 + 3 + 196.8992901900848 + 53.79307897413114 + + + EMS + EMS_475@GraphGeneration.gov + EMS_475 + 7 + 3 + 192.8781259593108 + 54.93182432608302 + + + EMS + EMS_477@GraphGeneration.gov + EMS_477 + 7 + 3 + 147.71900760387 + 30.838747420927255 + + + EMS + EMS_478@GraphGeneration.gov + EMS_478 + 10 + 3 + 167.07442427821394 + 56.70551856511803 + + + EMS + EMS_479@GraphGeneration.gov + EMS_479 + 9 + 3 + 140.55071096625963 + 47.52799320489429 + + + EMS + EMS_483@GraphGeneration.gov + EMS_483 + 9 + 3 + 135.26742431171144 + 39.261133069364696 + + + EMS + EMS_484@GraphGeneration.gov + EMS_484 + 10 + 3 + 160.5081597513588 + 40.261322045818346 + + + EMS + EMS_489@GraphGeneration.gov + EMS_489 + 11 + 3 + 165.85191416437468 + 44.00950520814835 + + + EMS + EMS_555@GraphGeneration.gov + EMS_555 + 7 + 3 + 23.558449212854203 + 76.96043131185675 + + + EMS + EMS_556@GraphGeneration.gov + EMS_556 + 12 + 3 + 13.533412548734127 + 75.03913341373018 + + + EMS + EMS_559@GraphGeneration.gov + EMS_559 + 6 + 3 + 52.21742820613614 + 66.8319260285027 + + + EMS + EMS_564@GraphGeneration.gov + EMS_564 + 6 + 3 + 3.5427276895848796 + 74.06168785876761 + + + EMS + EMS_566@GraphGeneration.gov + EMS_566 + 8 + 3 + 35.832983989918134 + 62.39289636785928 + + + EMS + EMS_568@GraphGeneration.gov + EMS_568 + 7 + 3 + 41.75905588346348 + 81.14518165658589 + + + EMS + EMS_572@GraphGeneration.gov + EMS_572 + 8 + 3 + 53.17614009485008 + 64.72812656026305 + + + EMS + EMS_576@GraphGeneration.gov + EMS_576 + 7 + 3 + 16.72626238759337 + 66.03330989236056 + + + EMS + EMS_577@GraphGeneration.gov + EMS_577 + 7 + 3 + 59.72756969209287 + 77.73258586211416 + + + EMS + EMS_578@GraphGeneration.gov + EMS_578 + 8 + 3 + 3.559194014138956 + 65.69492846239093 + + + EMS + EMS_646@GraphGeneration.gov + EMS_646 + 10 + 3 + 103.25716457712252 + 84.78672922617136 + + + EMS + EMS_649@GraphGeneration.gov + EMS_649 + 9 + 3 + 68.06431363631589 + 67.40682698940061 + + + EMS + EMS_650@GraphGeneration.gov + EMS_650 + 7 + 3 + 92.03650687041979 + 84.57784731831526 + + + EMS + EMS_654@GraphGeneration.gov + EMS_654 + 9 + 3 + 79.95934912246324 + 75.41407010452687 + + + EMS + EMS_655@GraphGeneration.gov + EMS_655 + 6 + 3 + 84.83577544438207 + 60.75708101918608 + + + EMS + EMS_747@GraphGeneration.gov + EMS_747 + 7 + 3 + 182.15989294153363 + 79.82479794900948 + + + EMS + EMS_756@GraphGeneration.gov + EMS_756 + 8 + 3 + 138.6900482303634 + 70.91028101099914 + + + EMS + EMS_765@GraphGeneration.gov + EMS_765 + 9 + 3 + 149.9843020387271 + 82.7865351805368 + + + EMS + EMS_830@GraphGeneration.gov + EMS_830 + 8 + 3 + 35.19556269453453 + 113.93603446562128 + + + EMS + EMS_834@GraphGeneration.gov + EMS_834 + 12 + 3 + 28.239230432558415 + 87.30772132710435 + + + EMS + EMS_838@GraphGeneration.gov + EMS_838 + 7 + 3 + 34.08890787004895 + 88.71297080939291 + + + EMS + EMS_840@GraphGeneration.gov + EMS_840 + 11 + 3 + 61.96115890156377 + 92.87149637662986 + + + EMS + EMS_842@GraphGeneration.gov + EMS_842 + 10 + 3 + 29.609409510777354 + 91.65794343550701 + + + EMS + EMS_844@GraphGeneration.gov + EMS_844 + 7 + 3 + 34.780808598859686 + 108.0363187562699 + + + EMS + EMS_853@GraphGeneration.gov + EMS_853 + 9 + 3 + 54.08185039317525 + 94.39705068859168 + + + EMS + EMS_926@GraphGeneration.gov + EMS_926 + 8 + 3 + 119.59235962503095 + 91.04116095488686 + + + EMS + EMS_940@GraphGeneration.gov + EMS_940 + 8 + 3 + 90.53617552200308 + 107.74798428969515 + + + EMS + EMS_941@GraphGeneration.gov + EMS_941 + 10 + 3 + 111.24429704599565 + 96.75956175243152 + + + EMS + EMS_944@GraphGeneration.gov + EMS_944 + 6 + 3 + 114.13388641297519 + 104.4254645199095 + + + EMS + EMS_1014@GraphGeneration.gov + EMS_1014 + 7 + 3 + 186.35365486205956 + 104.5211452848882 + + + EMS + EMS_1015@GraphGeneration.gov + EMS_1015 + 7 + 3 + 139.0683703041828 + 102.7670507336778 + + + EMS + EMS_1019@GraphGeneration.gov + EMS_1019 + 8 + 3 + 169.33481224423798 + 86.53438186872685 + + + EMS + EMS_1032@GraphGeneration.gov + EMS_1032 + 12 + 3 + 170.54616635856252 + 86.52522702804694 + + + EMS + EMS_1034@GraphGeneration.gov + EMS_1034 + 9 + 3 + 198.1637894718589 + 98.72441041923541 + + + EMS + EMS_1037@GraphGeneration.gov + EMS_1037 + 6 + 3 + 157.73302951980355 + 101.83655683973171 + + + EMS + EMS_1039@GraphGeneration.gov + EMS_1039 + 6 + 3 + 191.4007779359336 + 103.75019786174667 + + + EMS + EMS_1041@GraphGeneration.gov + EMS_1041 + 11 + 3 + 152.1275329164672 + 101.44147649976782 + + + EMS + EMS_1109@GraphGeneration.gov + EMS_1109 + 11 + 3 + 56.0666769464647 + 116.19992108946121 + + + EMS + EMS_1110@GraphGeneration.gov + EMS_1110 + 6 + 3 + 49.49404386118493 + 121.86630825778192 + + + EMS + EMS_1119@GraphGeneration.gov + EMS_1119 + 8 + 3 + 33.03643913101277 + 119.10341428549333 + + + EMS + EMS_1120@GraphGeneration.gov + EMS_1120 + 12 + 3 + 27.317911317031363 + 131.99623837291887 + + + EMS + EMS_1125@GraphGeneration.gov + EMS_1125 + 9 + 3 + 41.23544800073192 + 129.1114253992563 + + + EMS + EMS_1126@GraphGeneration.gov + EMS_1126 + 9 + 3 + 4.685243379641284 + 120.62559876805453 + + + EMS + EMS_1132@GraphGeneration.gov + EMS_1132 + 12 + 3 + 31.53642504053306 + 120.16283752923093 + + + EMS + EMS_1133@GraphGeneration.gov + EMS_1133 + 9 + 3 + 29.873750162490655 + 124.80135814088 + + + EMS + EMS_1197@GraphGeneration.gov + EMS_1197 + 6 + 3 + 119.69876160389165 + 131.63559081468088 + + + EMS + EMS_1200@GraphGeneration.gov + EMS_1200 + 12 + 3 + 73.71936413166263 + 120.62021462757595 + + + EMS + EMS_1202@GraphGeneration.gov + EMS_1202 + 9 + 3 + 106.56912227124695 + 120.04337869449665 + + + EMS + EMS_1204@GraphGeneration.gov + EMS_1204 + 10 + 3 + 114.2471178921621 + 129.02290693320705 + + + EMS + EMS_1207@GraphGeneration.gov + EMS_1207 + 6 + 3 + 114.45497449285153 + 132.2773212904305 + + + EMS + EMS_1213@GraphGeneration.gov + EMS_1213 + 12 + 3 + 90.9535423322244 + 115.38481419011217 + + + EMS + EMS_1215@GraphGeneration.gov + EMS_1215 + 9 + 3 + 131.29563710428536 + 138.9203424518477 + + + EMS + EMS_1217@GraphGeneration.gov + EMS_1217 + 7 + 3 + 129.3803718264499 + 133.42139418116474 + + + EMS + EMS_1218@GraphGeneration.gov + EMS_1218 + 7 + 3 + 100.74678521002404 + 120.10516056692931 + + + EMS + EMS_1219@GraphGeneration.gov + EMS_1219 + 11 + 3 + 79.02522854032824 + 115.47968160230239 + + + EMS + EMS_1221@GraphGeneration.gov + EMS_1221 + 7 + 3 + 91.22158320377272 + 141.8832830739202 + + + EMS + EMS_1222@GraphGeneration.gov + EMS_1222 + 6 + 3 + 125.81513724712335 + 115.50144185575287 + + + EMS + EMS_1224@GraphGeneration.gov + EMS_1224 + 10 + 3 + 123.28717927016312 + 120.82853433320514 + + + EMS + EMS_1294@GraphGeneration.gov + EMS_1294 + 8 + 3 + 146.72083583941742 + 123.62925968391946 + + + EMS + EMS_1295@GraphGeneration.gov + EMS_1295 + 9 + 3 + 147.2746875318341 + 141.72819134536056 + + + EMS + EMS_1298@GraphGeneration.gov + EMS_1298 + 9 + 3 + 179.7089278638544 + 138.24279769685225 + + + EMS + EMS_1299@GraphGeneration.gov + EMS_1299 + 6 + 3 + 159.13654409818196 + 122.43321840446885 + + + EMS + EMS_1302@GraphGeneration.gov + EMS_1302 + 7 + 3 + 174.51111655647514 + 118.06930039267512 + + + EMS + EMS_1303@GraphGeneration.gov + EMS_1303 + 11 + 3 + 170.9203899866778 + 123.13108304920668 + + + EMS + EMS_1305@GraphGeneration.gov + EMS_1305 + 10 + 3 + 185.34047303384656 + 117.64708180179775 + + + EMS + EMS_1309@GraphGeneration.gov + EMS_1309 + 11 + 3 + 146.27328998610437 + 125.76453008792058 + + + EMS + EMS_1315@GraphGeneration.gov + EMS_1315 + 11 + 3 + 187.36427123805882 + 141.9368395034346 + + + EMS + EMS_1381@GraphGeneration.gov + EMS_1381 + 8 + 3 + 5.3492953243621395 + 155.599181951314 + + + EMS + EMS_1383@GraphGeneration.gov + EMS_1383 + 12 + 3 + 12.385316957969916 + 156.20416613109444 + + + EMS + EMS_1388@GraphGeneration.gov + EMS_1388 + 9 + 3 + 1.1625912429850414 + 168.9039458126758 + + + EMS + EMS_1389@GraphGeneration.gov + EMS_1389 + 7 + 3 + 12.71995452535931 + 160.02677293932982 + + + EMS + EMS_1390@GraphGeneration.gov + EMS_1390 + 11 + 3 + 21.95379185578813 + 151.5795254157275 + + + EMS + EMS_1394@GraphGeneration.gov + EMS_1394 + 11 + 3 + 31.788911312447873 + 165.7497703727765 + + + EMS + EMS_1395@GraphGeneration.gov + EMS_1395 + 11 + 3 + 28.89474600495124 + 143.37944065511303 + + + EMS + EMS_1402@GraphGeneration.gov + EMS_1402 + 10 + 3 + 33.52760713801675 + 151.07974585728695 + + + EMS + EMS_1406@GraphGeneration.gov + EMS_1406 + 10 + 3 + 10.443227601979503 + 158.33777714519536 + + + EMS + EMS_1407@GraphGeneration.gov + EMS_1407 + 10 + 3 + 40.30439636111619 + 170.16761619418878 + + + EMS + EMS_1408@GraphGeneration.gov + EMS_1408 + 7 + 3 + 66.33361365470638 + 169.9807945710877 + + + EMS + EMS_1473@GraphGeneration.gov + EMS_1473 + 9 + 3 + 89.14257113579399 + 144.2199452194772 + + + EMS + EMS_1474@GraphGeneration.gov + EMS_1474 + 11 + 3 + 131.35478145549808 + 165.60461925390456 + + + EMS + EMS_1475@GraphGeneration.gov + EMS_1475 + 10 + 3 + 102.358642387392 + 163.34295671036392 + + + EMS + EMS_1485@GraphGeneration.gov + EMS_1485 + 11 + 3 + 117.7294726769618 + 158.65846857960793 + + + EMS + EMS_1488@GraphGeneration.gov + EMS_1488 + 9 + 3 + 122.13089287597884 + 170.36909900101355 + + + EMS + EMS_1490@GraphGeneration.gov + EMS_1490 + 7 + 3 + 112.43988713900453 + 147.96438699891723 + + + EMS + EMS_1491@GraphGeneration.gov + EMS_1491 + 12 + 3 + 101.95689427933513 + 147.43685464821115 + + + EMS + EMS_1492@GraphGeneration.gov + EMS_1492 + 8 + 3 + 96.40936586314378 + 159.58356893025694 + + + EMS + EMS_1493@GraphGeneration.gov + EMS_1493 + 10 + 3 + 99.53995132860042 + 170.06081638552257 + + + EMS + EMS_1502@GraphGeneration.gov + EMS_1502 + 10 + 3 + 81.39672087269939 + 167.04225994901282 + + + EMS + EMS_1567@GraphGeneration.gov + EMS_1567 + 10 + 3 + 166.82404701263096 + 169.87532005652628 + + + EMS + EMS_1584@GraphGeneration.gov + EMS_1584 + 7 + 3 + 199.25363211519942 + 169.75562848251107 + + + EMS + EMS_1585@GraphGeneration.gov + EMS_1585 + 9 + 3 + 171.03171190663355 + 155.35523352598568 + + + EMS + EMS_1659@GraphGeneration.gov + EMS_1659 + 12 + 3 + 27.936271559116705 + 184.63417468874792 + + + EMS + EMS_1661@GraphGeneration.gov + EMS_1661 + 6 + 3 + 41.90842215457704 + 173.1458002678863 + + + EMS + EMS_1665@GraphGeneration.gov + EMS_1665 + 7 + 3 + 34.627238347497645 + 176.33294006588406 + + + EMS + EMS_1672@GraphGeneration.gov + EMS_1672 + 6 + 3 + 58.846612251078774 + 196.32039684931544 + + + EMS + EMS_1682@GraphGeneration.gov + EMS_1682 + 8 + 3 + 8.169835457024737 + 183.270877150289 + + + EMS + EMS_1683@GraphGeneration.gov + EMS_1683 + 10 + 3 + 37.795099963227635 + 187.93813586906077 + + + EMS + EMS_1755@GraphGeneration.gov + EMS_1755 + 10 + 3 + 121.76524496883593 + 199.0747906273082 + + + EMS + EMS_1756@GraphGeneration.gov + EMS_1756 + 7 + 3 + 79.96262869325726 + 185.9738058525145 + + + EMS + EMS_1758@GraphGeneration.gov + EMS_1758 + 8 + 3 + 101.00731254134314 + 199.61069063684127 + + + EMS + EMS_1764@GraphGeneration.gov + EMS_1764 + 12 + 3 + 87.11387569301786 + 176.89599386942484 + + + EMS + EMS_1766@GraphGeneration.gov + EMS_1766 + 10 + 3 + 121.68728127305477 + 194.7106841397353 + + + EMS + EMS_1770@GraphGeneration.gov + EMS_1770 + 7 + 3 + 109.48504453298617 + 184.0813405475857 + + + EMS + EMS_1772@GraphGeneration.gov + EMS_1772 + 9 + 3 + 114.79362903513115 + 171.6000298301522 + + + EMS + EMS_1773@GraphGeneration.gov + EMS_1773 + 6 + 3 + 127.91861464171726 + 194.31665842322812 + + + EMS + EMS_1774@GraphGeneration.gov + EMS_1774 + 10 + 3 + 114.9521941115005 + 188.45805402899342 + + + EMS + EMS_1848@GraphGeneration.gov + EMS_1848 + 6 + 3 + 145.11964079631423 + 198.03865984403163 + + + EMS + EMS_1857@GraphGeneration.gov + EMS_1857 + 7 + 3 + 199.1699565885742 + 178.78775512950014 + + + EMS + EMS_1862@GraphGeneration.gov + EMS_1862 + 11 + 3 + 162.3460279348548 + 172.75920290988665 + + + EMS + EMS_1863@GraphGeneration.gov + EMS_1863 + 8 + 3 + 192.55805425088587 + 176.3576246714392 + + + EMS + EMS_1870@GraphGeneration.gov + EMS_1870 + 8 + 3 + 143.31532006518248 + 193.65493786257537 + + + FIRE + FIRE_32@GraphGeneration.gov + FIRE_32 + 11 + 3 + 47.57057959023745 + 26.254224269575012 + + + FIRE + FIRE_36@GraphGeneration.gov + FIRE_36 + 10 + 3 + 5.222501134114836 + 6.973078231367458 + + + FIRE + FIRE_43@GraphGeneration.gov + FIRE_43 + 9 + 3 + 11.825280193481658 + 22.848353117781063 + + + FIRE + FIRE_46@GraphGeneration.gov + FIRE_46 + 7 + 3 + 63.504211010876645 + 4.8364942883173745 + + + FIRE + FIRE_57@GraphGeneration.gov + FIRE_57 + 8 + 3 + 13.490857540927664 + 14.063708604128864 + + + FIRE + FIRE_60@GraphGeneration.gov + FIRE_60 + 10 + 3 + 26.813846683779968 + 0.4744987351392378 + + + FIRE + FIRE_130@GraphGeneration.gov + FIRE_130 + 9 + 3 + 108.39850414806489 + 22.159351596375203 + + + FIRE + FIRE_132@GraphGeneration.gov + FIRE_132 + 12 + 3 + 128.42310772269946 + 21.903205096975686 + + + FIRE + FIRE_138@GraphGeneration.gov + FIRE_138 + 8 + 3 + 84.08011027526481 + 16.774323743301796 + + + FIRE + FIRE_216@GraphGeneration.gov + FIRE_216 + 11 + 3 + 170.27994294677848 + 0.46477230279969073 + + + FIRE + FIRE_218@GraphGeneration.gov + FIRE_218 + 11 + 3 + 142.81423102253356 + 21.913644847034245 + + + FIRE + FIRE_223@GraphGeneration.gov + FIRE_223 + 8 + 3 + 137.90057614426513 + 3.7399500282800737 + + + FIRE + FIRE_224@GraphGeneration.gov + FIRE_224 + 8 + 3 + 151.1421609232001 + 1.2938513679105494 + + + FIRE + FIRE_233@GraphGeneration.gov + FIRE_233 + 10 + 3 + 185.5434825731878 + 15.78812407873794 + + + FIRE + FIRE_236@GraphGeneration.gov + FIRE_236 + 7 + 3 + 146.07443124880984 + 14.34756133984008 + + + FIRE + FIRE_237@GraphGeneration.gov + FIRE_237 + 11 + 3 + 185.40842457311103 + 8.280549688338827 + + + FIRE + FIRE_241@GraphGeneration.gov + FIRE_241 + 9 + 3 + 164.48891241731138 + 15.896884674475261 + + + FIRE + FIRE_244@GraphGeneration.gov + FIRE_244 + 8 + 3 + 133.58244141638426 + 5.596314442042532 + + + FIRE + FIRE_317@GraphGeneration.gov + FIRE_317 + 9 + 3 + 5.267052479841132 + 29.983430954950585 + + + FIRE + FIRE_321@GraphGeneration.gov + FIRE_321 + 9 + 3 + 33.14115908066283 + 55.87269589146467 + + + FIRE + FIRE_322@GraphGeneration.gov + FIRE_322 + 7 + 3 + 45.71641455623825 + 50.63164853091442 + + + FIRE + FIRE_327@GraphGeneration.gov + FIRE_327 + 7 + 3 + 58.88238218909368 + 38.522274552838496 + + + FIRE + FIRE_328@GraphGeneration.gov + FIRE_328 + 6 + 3 + 4.556081742620159 + 57.02098312629834 + + + FIRE + FIRE_330@GraphGeneration.gov + FIRE_330 + 8 + 3 + 4.002159118747358 + 54.99728354336088 + + + FIRE + FIRE_331@GraphGeneration.gov + FIRE_331 + 11 + 3 + 19.491793737593348 + 37.864053929964406 + + + FIRE + FIRE_333@GraphGeneration.gov + FIRE_333 + 12 + 3 + 12.255172074552727 + 42.71664037829499 + + + FIRE + FIRE_400@GraphGeneration.gov + FIRE_400 + 11 + 3 + 72.75059928891596 + 30.499159760631017 + + + FIRE + FIRE_403@GraphGeneration.gov + FIRE_403 + 6 + 3 + 131.05763731942557 + 34.72139702831529 + + + FIRE + FIRE_409@GraphGeneration.gov + FIRE_409 + 9 + 3 + 74.76069671634727 + 38.85359160036283 + + + FIRE + FIRE_413@GraphGeneration.gov + FIRE_413 + 10 + 3 + 119.42778753295076 + 29.513527716574735 + + + FIRE + FIRE_416@GraphGeneration.gov + FIRE_416 + 8 + 3 + 73.1015351002251 + 55.18255233358076 + + + FIRE + FIRE_421@GraphGeneration.gov + FIRE_421 + 10 + 3 + 106.69667967441627 + 46.07873004080717 + + + FIRE + FIRE_425@GraphGeneration.gov + FIRE_425 + 9 + 3 + 67.24859947227547 + 53.365983953145815 + + + FIRE + FIRE_491@GraphGeneration.gov + FIRE_491 + 12 + 3 + 151.62021241541802 + 56.81577253687372 + + + FIRE + FIRE_495@GraphGeneration.gov + FIRE_495 + 12 + 3 + 150.4133815601329 + 33.71571237063659 + + + FIRE + FIRE_498@GraphGeneration.gov + FIRE_498 + 10 + 3 + 139.8555166337545 + 54.026468987362335 + + + FIRE + FIRE_499@GraphGeneration.gov + FIRE_499 + 8 + 3 + 189.448595234537 + 54.51255740489236 + + + FIRE + FIRE_509@GraphGeneration.gov + FIRE_509 + 12 + 3 + 149.32285607832094 + 54.51447011954008 + + + FIRE + FIRE_510@GraphGeneration.gov + FIRE_510 + 11 + 3 + 192.84557886234208 + 56.77838200801122 + + + FIRE + FIRE_512@GraphGeneration.gov + FIRE_512 + 10 + 3 + 166.15269448292977 + 47.09115875991651 + + + FIRE + FIRE_514@GraphGeneration.gov + FIRE_514 + 9 + 3 + 199.90465199183882 + 40.956742597454706 + + + FIRE + FIRE_585@GraphGeneration.gov + FIRE_585 + 8 + 3 + 39.30999458932309 + 74.66019673863022 + + + FIRE + FIRE_592@GraphGeneration.gov + FIRE_592 + 9 + 3 + 56.90077753201705 + 85.35317464252012 + + + FIRE + FIRE_595@GraphGeneration.gov + FIRE_595 + 11 + 3 + 53.5128703178043 + 69.3846581667842 + + + FIRE + FIRE_597@GraphGeneration.gov + FIRE_597 + 7 + 3 + 38.89940294757533 + 79.16933146660017 + + + FIRE + FIRE_603@GraphGeneration.gov + FIRE_603 + 12 + 3 + 9.036329889032292 + 75.03942989208672 + + + FIRE + FIRE_607@GraphGeneration.gov + FIRE_607 + 7 + 3 + 66.62957541907274 + 67.83075252534688 + + + FIRE + FIRE_608@GraphGeneration.gov + FIRE_608 + 7 + 3 + 33.62886795119296 + 78.87723232400742 + + + FIRE + FIRE_611@GraphGeneration.gov + FIRE_611 + 11 + 3 + 25.18484488704566 + 73.1287009455179 + + + FIRE + FIRE_678@GraphGeneration.gov + FIRE_678 + 12 + 3 + 86.67431008666188 + 72.72126100377709 + + + FIRE + FIRE_679@GraphGeneration.gov + FIRE_679 + 10 + 3 + 101.24791366838636 + 78.28390079823276 + + + FIRE + FIRE_686@GraphGeneration.gov + FIRE_686 + 10 + 3 + 117.5675499399102 + 64.89245108576564 + + + FIRE + FIRE_693@GraphGeneration.gov + FIRE_693 + 12 + 3 + 96.97528585642874 + 67.9252794429342 + + + FIRE + FIRE_694@GraphGeneration.gov + FIRE_694 + 10 + 3 + 81.39655004583713 + 75.7807416809569 + + + FIRE + FIRE_696@GraphGeneration.gov + FIRE_696 + 8 + 3 + 116.14774716749321 + 77.81429004969988 + + + FIRE + FIRE_699@GraphGeneration.gov + FIRE_699 + 7 + 3 + 73.60263899092193 + 69.51428656508075 + + + FIRE + FIRE_703@GraphGeneration.gov + FIRE_703 + 12 + 3 + 99.14631802356413 + 80.11186200293974 + + + FIRE + FIRE_769@GraphGeneration.gov + FIRE_769 + 12 + 3 + 169.13260520621412 + 57.87429939477528 + + + FIRE + FIRE_776@GraphGeneration.gov + FIRE_776 + 6 + 3 + 179.4568572300122 + 62.44118155804556 + + + FIRE + FIRE_793@GraphGeneration.gov + FIRE_793 + 7 + 3 + 184.72326872647653 + 78.19125146175045 + + + FIRE + FIRE_862@GraphGeneration.gov + FIRE_862 + 10 + 3 + 4.1054803343184645 + 86.67873983534686 + + + FIRE + FIRE_864@GraphGeneration.gov + FIRE_864 + 12 + 3 + 14.34531221959603 + 111.98786382579775 + + + FIRE + FIRE_875@GraphGeneration.gov + FIRE_875 + 10 + 3 + 3.606920273034198 + 89.85127266652232 + + + FIRE + FIRE_880@GraphGeneration.gov + FIRE_880 + 10 + 3 + 48.87661117991167 + 104.96966471043504 + + + FIRE + FIRE_882@GraphGeneration.gov + FIRE_882 + 11 + 3 + 61.25583181811367 + 97.26638608707624 + + + FIRE + FIRE_886@GraphGeneration.gov + FIRE_886 + 9 + 3 + 23.69926065265144 + 106.70786620688412 + + + FIRE + FIRE_887@GraphGeneration.gov + FIRE_887 + 8 + 3 + 30.296724695102903 + 101.73126395875015 + + + FIRE + FIRE_888@GraphGeneration.gov + FIRE_888 + 10 + 3 + 6.485397694450882 + 110.76215956870666 + + + FIRE + FIRE_952@GraphGeneration.gov + FIRE_952 + 7 + 3 + 112.99510122399218 + 92.26131911650839 + + + FIRE + FIRE_954@GraphGeneration.gov + FIRE_954 + 12 + 3 + 109.0004714881137 + 103.20778096092675 + + + FIRE + FIRE_958@GraphGeneration.gov + FIRE_958 + 9 + 3 + 83.09991931090269 + 110.03779555549413 + + + FIRE + FIRE_961@GraphGeneration.gov + FIRE_961 + 8 + 3 + 119.63540638428523 + 103.01991514414328 + + + FIRE + FIRE_962@GraphGeneration.gov + FIRE_962 + 12 + 3 + 79.35987873192806 + 100.2439628998095 + + + FIRE + FIRE_963@GraphGeneration.gov + FIRE_963 + 7 + 3 + 126.60935009918128 + 106.15836888003227 + + + FIRE + FIRE_968@GraphGeneration.gov + FIRE_968 + 9 + 3 + 117.09184136045397 + 96.59040102871509 + + + FIRE + FIRE_974@GraphGeneration.gov + FIRE_974 + 10 + 3 + 99.05090425350653 + 86.39697676318929 + + + FIRE + FIRE_975@GraphGeneration.gov + FIRE_975 + 7 + 3 + 120.39267845690435 + 95.68869663838409 + + + FIRE + FIRE_1046@GraphGeneration.gov + FIRE_1046 + 9 + 3 + 196.9564951192461 + 86.12522433802052 + + + FIRE + FIRE_1052@GraphGeneration.gov + FIRE_1052 + 8 + 3 + 142.84748202611428 + 101.54821152625549 + + + FIRE + FIRE_1053@GraphGeneration.gov + FIRE_1053 + 10 + 3 + 138.9173400361225 + 89.20521494734226 + + + FIRE + FIRE_1054@GraphGeneration.gov + FIRE_1054 + 6 + 3 + 195.018139545573 + 113.16804371642417 + + + FIRE + FIRE_1058@GraphGeneration.gov + FIRE_1058 + 8 + 3 + 179.92394658338236 + 113.97148347700085 + + + FIRE + FIRE_1059@GraphGeneration.gov + FIRE_1059 + 9 + 3 + 145.97731208877403 + 99.30702410704431 + + + FIRE + FIRE_1064@GraphGeneration.gov + FIRE_1064 + 8 + 3 + 144.74946924514495 + 85.93822599135157 + + + FIRE + FIRE_1066@GraphGeneration.gov + FIRE_1066 + 9 + 3 + 137.74241944115613 + 109.28645765181527 + + + FIRE + FIRE_1069@GraphGeneration.gov + FIRE_1069 + 11 + 3 + 198.85707718853268 + 112.4493545792754 + + + FIRE + FIRE_1141@GraphGeneration.gov + FIRE_1141 + 10 + 3 + 37.99580066653415 + 121.99366880368049 + + + FIRE + FIRE_1144@GraphGeneration.gov + FIRE_1144 + 10 + 3 + 54.980313121816714 + 120.3857889076061 + + + FIRE + FIRE_1147@GraphGeneration.gov + FIRE_1147 + 6 + 3 + 42.099586210601345 + 118.04832221775425 + + + FIRE + FIRE_1148@GraphGeneration.gov + FIRE_1148 + 12 + 3 + 11.42967815948756 + 127.49730939374592 + + + FIRE + FIRE_1150@GraphGeneration.gov + FIRE_1150 + 10 + 3 + 39.14321055542453 + 132.63780926269948 + + + FIRE + FIRE_1151@GraphGeneration.gov + FIRE_1151 + 10 + 3 + 37.9611075389852 + 139.86601462868714 + + + FIRE + FIRE_1154@GraphGeneration.gov + FIRE_1154 + 11 + 3 + 24.78228709943132 + 120.66507061740215 + + + FIRE + FIRE_1155@GraphGeneration.gov + FIRE_1155 + 11 + 3 + 18.58902315011671 + 119.17194764083864 + + + FIRE + FIRE_1232@GraphGeneration.gov + FIRE_1232 + 12 + 3 + 85.67582042978923 + 133.4824358164288 + + + FIRE + FIRE_1234@GraphGeneration.gov + FIRE_1234 + 7 + 3 + 99.2413960416801 + 130.3617769275604 + + + FIRE + FIRE_1237@GraphGeneration.gov + FIRE_1237 + 10 + 3 + 69.37508337456143 + 132.61158865892426 + + + FIRE + FIRE_1239@GraphGeneration.gov + FIRE_1239 + 6 + 3 + 132.50006674165962 + 131.4742649233014 + + + FIRE + FIRE_1243@GraphGeneration.gov + FIRE_1243 + 12 + 3 + 132.14264497531187 + 132.87300525584806 + + + FIRE + FIRE_1251@GraphGeneration.gov + FIRE_1251 + 10 + 3 + 119.36061296500648 + 119.82211539984287 + + + FIRE + FIRE_1252@GraphGeneration.gov + FIRE_1252 + 6 + 3 + 82.38006193359385 + 132.84036850895393 + + + FIRE + FIRE_1319@GraphGeneration.gov + FIRE_1319 + 8 + 3 + 144.93643612232205 + 133.78638938330755 + + + FIRE + FIRE_1321@GraphGeneration.gov + FIRE_1321 + 10 + 3 + 137.53902502041257 + 134.4835302730417 + + + FIRE + FIRE_1322@GraphGeneration.gov + FIRE_1322 + 11 + 3 + 134.44944708905166 + 117.63881770029971 + + + FIRE + FIRE_1324@GraphGeneration.gov + FIRE_1324 + 10 + 3 + 156.52479355523593 + 133.96907952543444 + + + FIRE + FIRE_1333@GraphGeneration.gov + FIRE_1333 + 10 + 3 + 187.0977180808402 + 125.16013036710578 + + + FIRE + FIRE_1339@GraphGeneration.gov + FIRE_1339 + 10 + 3 + 148.3356274402297 + 119.73120969575794 + + + FIRE + FIRE_1417@GraphGeneration.gov + FIRE_1417 + 8 + 3 + 15.969649363571607 + 155.829595009723 + + + FIRE + FIRE_1424@GraphGeneration.gov + FIRE_1424 + 8 + 3 + 66.13495106611548 + 159.85512120365397 + + + FIRE + FIRE_1432@GraphGeneration.gov + FIRE_1432 + 8 + 3 + 10.007607624024596 + 163.90646211334237 + + + FIRE + FIRE_1434@GraphGeneration.gov + FIRE_1434 + 12 + 3 + 0.5734600906778983 + 168.12814709681118 + + + FIRE + FIRE_1436@GraphGeneration.gov + FIRE_1436 + 9 + 3 + 5.924872127490281 + 158.91535253841494 + + + FIRE + FIRE_1506@GraphGeneration.gov + FIRE_1506 + 10 + 3 + 124.1493779684005 + 169.59001224045747 + + + FIRE + FIRE_1512@GraphGeneration.gov + FIRE_1512 + 10 + 3 + 106.34840595538509 + 161.0132364800669 + + + FIRE + FIRE_1515@GraphGeneration.gov + FIRE_1515 + 10 + 3 + 117.63418125176499 + 165.52548450575944 + + + FIRE + FIRE_1519@GraphGeneration.gov + FIRE_1519 + 6 + 3 + 131.99650119711288 + 160.64925801131653 + + + FIRE + FIRE_1521@GraphGeneration.gov + FIRE_1521 + 8 + 3 + 89.72324057228916 + 157.15572794994836 + + + FIRE + FIRE_1528@GraphGeneration.gov + FIRE_1528 + 12 + 3 + 69.37445674559208 + 170.79576512851952 + + + FIRE + FIRE_1529@GraphGeneration.gov + FIRE_1529 + 12 + 3 + 130.24963148583058 + 161.92866311074917 + + + FIRE + FIRE_1530@GraphGeneration.gov + FIRE_1530 + 12 + 3 + 94.19641705110587 + 165.32387785175698 + + + FIRE + FIRE_1600@GraphGeneration.gov + FIRE_1600 + 11 + 3 + 192.67255749849105 + 157.526643020952 + + + FIRE + FIRE_1601@GraphGeneration.gov + FIRE_1601 + 6 + 3 + 164.30639416457785 + 143.98069820571695 + + + FIRE + FIRE_1602@GraphGeneration.gov + FIRE_1602 + 9 + 3 + 134.98519369924074 + 162.96405782679878 + + + FIRE + FIRE_1603@GraphGeneration.gov + FIRE_1603 + 9 + 3 + 168.45388352714693 + 169.50468014092226 + + + FIRE + FIRE_1604@GraphGeneration.gov + FIRE_1604 + 9 + 3 + 143.394085553768 + 144.6043788226785 + + + FIRE + FIRE_1606@GraphGeneration.gov + FIRE_1606 + 12 + 3 + 171.4094508449777 + 163.12191799769104 + + + FIRE + FIRE_1609@GraphGeneration.gov + FIRE_1609 + 9 + 3 + 182.3091357096501 + 167.27099245044633 + + + FIRE + FIRE_1616@GraphGeneration.gov + FIRE_1616 + 7 + 3 + 189.36554328054723 + 168.70679436270132 + + + FIRE + FIRE_1618@GraphGeneration.gov + FIRE_1618 + 11 + 3 + 148.84556052692142 + 151.49642402800865 + + + FIRE + FIRE_1619@GraphGeneration.gov + FIRE_1619 + 10 + 3 + 143.1896037089847 + 150.50718234136957 + + + FIRE + FIRE_1623@GraphGeneration.gov + FIRE_1623 + 10 + 3 + 183.9923503310525 + 154.15774408999195 + + + FIRE + FIRE_1688@GraphGeneration.gov + FIRE_1688 + 11 + 3 + 17.776040073462955 + 188.24383603091246 + + + FIRE + FIRE_1690@GraphGeneration.gov + FIRE_1690 + 9 + 3 + 33.83366796711004 + 196.99770341446936 + + + FIRE + FIRE_1698@GraphGeneration.gov + FIRE_1698 + 11 + 3 + 33.282922932725405 + 184.55746040305127 + + + FIRE + FIRE_1700@GraphGeneration.gov + FIRE_1700 + 8 + 3 + 44.025708746340115 + 172.63423070600112 + + + FIRE + FIRE_1701@GraphGeneration.gov + FIRE_1701 + 7 + 3 + 17.756283344944006 + 173.94034085583698 + + + FIRE + FIRE_1703@GraphGeneration.gov + FIRE_1703 + 6 + 3 + 59.47358610217616 + 192.3315028954653 + + + FIRE + FIRE_1705@GraphGeneration.gov + FIRE_1705 + 11 + 3 + 1.1580592681277389 + 188.06662369758487 + + + FIRE + FIRE_1706@GraphGeneration.gov + FIRE_1706 + 8 + 3 + 39.731888551464095 + 173.10745070644305 + + + FIRE + FIRE_1708@GraphGeneration.gov + FIRE_1708 + 10 + 3 + 9.116614800719578 + 198.33159329831133 + + + FIRE + FIRE_1709@GraphGeneration.gov + FIRE_1709 + 6 + 3 + 17.464164674105735 + 184.85989950774947 + + + FIRE + FIRE_1710@GraphGeneration.gov + FIRE_1710 + 10 + 3 + 46.4638830707389 + 192.97447157439916 + + + FIRE + FIRE_1791@GraphGeneration.gov + FIRE_1791 + 7 + 3 + 129.18838674117856 + 176.19142734250076 + + + FIRE + FIRE_1803@GraphGeneration.gov + FIRE_1803 + 9 + 3 + 98.28791889105773 + 186.43431750061694 + + + FIRE + FIRE_1804@GraphGeneration.gov + FIRE_1804 + 9 + 3 + 79.00521670793822 + 190.0656889522525 + + + FIRE + FIRE_1806@GraphGeneration.gov + FIRE_1806 + 10 + 3 + 103.81997094644683 + 197.4696753073261 + + + FIRE + FIRE_1877@GraphGeneration.gov + FIRE_1877 + 9 + 3 + 182.81136342907595 + 189.46513303825668 + + + FIRE + FIRE_1879@GraphGeneration.gov + FIRE_1879 + 12 + 3 + 140.91810993325984 + 172.71219225296264 + + + FIRE + FIRE_1880@GraphGeneration.gov + FIRE_1880 + 8 + 3 + 147.33986068342224 + 180.854174688569 + + + FIRE + FIRE_1888@GraphGeneration.gov + FIRE_1888 + 7 + 3 + 156.65123422961406 + 178.30932727735438 + + + FIRE + FIRE_1889@GraphGeneration.gov + FIRE_1889 + 12 + 3 + 171.33413944145718 + 182.74504195278698 + + + FIRE + FIRE_1899@GraphGeneration.gov + FIRE_1899 + 11 + 3 + 189.4037915892209 + 191.67904595008176 + + + LAW + LAW_65@GraphGeneration.gov + LAW_65 + 8 + 3 + 29.81810003999468 + 1.2951546951240298 + + + LAW + LAW_67@GraphGeneration.gov + LAW_67 + 8 + 3 + 55.68254061493399 + 13.026671750122546 + + + LAW + LAW_71@GraphGeneration.gov + LAW_71 + 8 + 3 + 15.148276272004296 + 24.890994857098892 + + + LAW + LAW_72@GraphGeneration.gov + LAW_72 + 12 + 3 + 33.51494288522809 + 16.349014309529487 + + + LAW + LAW_78@GraphGeneration.gov + LAW_78 + 11 + 3 + 33.06495529832618 + 27.910918129747447 + + + LAW + LAW_81@GraphGeneration.gov + LAW_81 + 10 + 3 + 7.039588654102895 + 15.105350097284827 + + + LAW + LAW_85@GraphGeneration.gov + LAW_85 + 10 + 3 + 52.399888122118334 + 15.774945389733288 + + + LAW + LAW_88@GraphGeneration.gov + LAW_88 + 10 + 3 + 0.5135180320106218 + 1.5860408042562646 + + + LAW + LAW_154@GraphGeneration.gov + LAW_154 + 11 + 3 + 95.17008231104307 + 18.99330242898587 + + + LAW + LAW_155@GraphGeneration.gov + LAW_155 + 8 + 3 + 68.48583219299837 + 17.231032232287546 + + + LAW + LAW_170@GraphGeneration.gov + LAW_170 + 10 + 3 + 83.12419942974546 + 8.07107489724747 + + + LAW + LAW_173@GraphGeneration.gov + LAW_173 + 12 + 3 + 117.10056384593204 + 1.2138114538665201 + + + LAW + LAW_177@GraphGeneration.gov + LAW_177 + 6 + 3 + 109.53101609117036 + 23.638880229435028 + + + LAW + LAW_178@GraphGeneration.gov + LAW_178 + 6 + 3 + 121.15092668841908 + 16.505224811286492 + + + LAW + LAW_180@GraphGeneration.gov + LAW_180 + 9 + 3 + 72.08733410586731 + 24.510264949743252 + + + LAW + LAW_246@GraphGeneration.gov + LAW_246 + 6 + 3 + 162.86417118017422 + 12.929682621956932 + + + LAW + LAW_250@GraphGeneration.gov + LAW_250 + 8 + 3 + 184.88805044271936 + 24.689085045662615 + + + LAW + LAW_252@GraphGeneration.gov + LAW_252 + 12 + 3 + 170.17164384379257 + 15.91096918049294 + + + LAW + LAW_253@GraphGeneration.gov + LAW_253 + 12 + 3 + 134.31279832777614 + 11.463557174695335 + + + LAW + LAW_254@GraphGeneration.gov + LAW_254 + 6 + 3 + 198.3120827047888 + 26.59878787539274 + + + LAW + LAW_256@GraphGeneration.gov + LAW_256 + 12 + 3 + 156.57985691874484 + 13.815871325282691 + + + LAW + LAW_271@GraphGeneration.gov + LAW_271 + 7 + 3 + 147.8752073631516 + 6.5400947449046996 + + + LAW + LAW_274@GraphGeneration.gov + LAW_274 + 12 + 3 + 195.91548315330857 + 8.542709886870282 + + + LAW + LAW_338@GraphGeneration.gov + LAW_338 + 9 + 3 + 26.428447173218885 + 47.84106239601367 + + + LAW + LAW_340@GraphGeneration.gov + LAW_340 + 6 + 3 + 30.789870252049365 + 42.420864967365944 + + + LAW + LAW_342@GraphGeneration.gov + LAW_342 + 12 + 3 + 55.93389267185731 + 48.08205584552062 + + + LAW + LAW_350@GraphGeneration.gov + LAW_350 + 9 + 3 + 50.460970753960005 + 37.26432808059144 + + + LAW + LAW_351@GraphGeneration.gov + LAW_351 + 12 + 3 + 59.199080469075376 + 55.352810201187765 + + + LAW + LAW_352@GraphGeneration.gov + LAW_352 + 6 + 3 + 3.1641128350201537 + 55.23932380026754 + + + LAW + LAW_357@GraphGeneration.gov + LAW_357 + 7 + 3 + 53.224377444652575 + 33.50759381782258 + + + LAW + LAW_359@GraphGeneration.gov + LAW_359 + 11 + 3 + 20.063995369913073 + 41.45173559243021 + + + LAW + LAW_362@GraphGeneration.gov + LAW_362 + 10 + 3 + 54.24132095413452 + 54.58483851891866 + + + LAW + LAW_364@GraphGeneration.gov + LAW_364 + 6 + 3 + 9.769982496627543 + 31.28153789904484 + + + LAW + LAW_440@GraphGeneration.gov + LAW_440 + 11 + 3 + 108.7694069103422 + 43.58097493164782 + + + LAW + LAW_455@GraphGeneration.gov + LAW_455 + 10 + 3 + 127.76033951086272 + 50.23094400010396 + + + LAW + LAW_456@GraphGeneration.gov + LAW_456 + 8 + 3 + 109.90027225910411 + 32.58426631365864 + + + LAW + LAW_522@GraphGeneration.gov + LAW_522 + 10 + 3 + 153.8649668876646 + 52.828204414595945 + + + LAW + LAW_526@GraphGeneration.gov + LAW_526 + 7 + 3 + 187.28698258605078 + 32.91252913268218 + + + LAW + LAW_531@GraphGeneration.gov + LAW_531 + 10 + 3 + 158.23735296228685 + 35.62065916207106 + + + LAW + LAW_534@GraphGeneration.gov + LAW_534 + 8 + 3 + 157.97801828480883 + 32.85939534600077 + + + LAW + LAW_539@GraphGeneration.gov + LAW_539 + 8 + 3 + 143.13376933958267 + 49.26497249748273 + + + LAW + LAW_544@GraphGeneration.gov + LAW_544 + 9 + 3 + 163.2725305991702 + 32.67974239014389 + + + LAW + LAW_546@GraphGeneration.gov + LAW_546 + 9 + 3 + 166.25961971307538 + 29.05257665579223 + + + LAW + LAW_614@GraphGeneration.gov + LAW_614 + 8 + 3 + 44.13118065380563 + 71.71312068308842 + + + LAW + LAW_619@GraphGeneration.gov + LAW_619 + 8 + 3 + 1.5102316142698635 + 60.460882375081695 + + + LAW + LAW_624@GraphGeneration.gov + LAW_624 + 9 + 3 + 44.754028129251296 + 62.53555479225413 + + + LAW + LAW_625@GraphGeneration.gov + LAW_625 + 12 + 3 + 35.359137290486856 + 77.59178087616782 + + + LAW + LAW_627@GraphGeneration.gov + LAW_627 + 9 + 3 + 29.919055667410333 + 67.74714329210133 + + + LAW + LAW_629@GraphGeneration.gov + LAW_629 + 11 + 3 + 48.03250245691066 + 58.222497633076365 + + + LAW + LAW_630@GraphGeneration.gov + LAW_630 + 8 + 3 + 40.4289910175408 + 66.79182747960782 + + + LAW + LAW_631@GraphGeneration.gov + LAW_631 + 6 + 3 + 28.703956891728232 + 63.958008349226354 + + + LAW + LAW_633@GraphGeneration.gov + LAW_633 + 12 + 3 + 27.28193505301829 + 84.0775535090695 + + + LAW + LAW_637@GraphGeneration.gov + LAW_637 + 7 + 3 + 21.18407991633821 + 66.93497781452096 + + + LAW + LAW_638@GraphGeneration.gov + LAW_638 + 12 + 3 + 26.611494343948888 + 73.73905905294666 + + + LAW + LAW_641@GraphGeneration.gov + LAW_641 + 11 + 3 + 46.53748631299381 + 58.83309351709392 + + + LAW + LAW_709@GraphGeneration.gov + LAW_709 + 8 + 3 + 74.43941056450055 + 80.30725293188698 + + + LAW + LAW_710@GraphGeneration.gov + LAW_710 + 8 + 3 + 89.40051722094378 + 78.06908509549629 + + + LAW + LAW_711@GraphGeneration.gov + LAW_711 + 7 + 3 + 98.2705884221437 + 71.19693129602389 + + + LAW + LAW_713@GraphGeneration.gov + LAW_713 + 6 + 3 + 68.18382097238143 + 59.47528612328815 + + + LAW + LAW_723@GraphGeneration.gov + LAW_723 + 6 + 3 + 85.91894426424955 + 79.51784803609681 + + + LAW + LAW_727@GraphGeneration.gov + LAW_727 + 8 + 3 + 81.45926108481588 + 80.18637801078359 + + + LAW + LAW_729@GraphGeneration.gov + LAW_729 + 12 + 3 + 117.19387074663138 + 83.3631061857958 + + + LAW + LAW_730@GraphGeneration.gov + LAW_730 + 11 + 3 + 93.18471887966223 + 57.281797025137614 + + + LAW + LAW_732@GraphGeneration.gov + LAW_732 + 12 + 3 + 85.80535743926534 + 64.63755909018715 + + + LAW + LAW_799@GraphGeneration.gov + LAW_799 + 6 + 3 + 174.95383445752805 + 58.37830005357547 + + + LAW + LAW_802@GraphGeneration.gov + LAW_802 + 11 + 3 + 169.44511686951762 + 60.080376574105685 + + + LAW + LAW_803@GraphGeneration.gov + LAW_803 + 11 + 3 + 154.9885415171778 + 63.15837448711678 + + + LAW + LAW_804@GraphGeneration.gov + LAW_804 + 12 + 3 + 176.77197894478257 + 85.61545559675591 + + + LAW + LAW_807@GraphGeneration.gov + LAW_807 + 8 + 3 + 169.9412147292906 + 68.167498815486 + + + LAW + LAW_814@GraphGeneration.gov + LAW_814 + 11 + 3 + 143.58293434704382 + 72.92693480062005 + + + LAW + LAW_816@GraphGeneration.gov + LAW_816 + 7 + 3 + 184.8279856962672 + 61.63702693216015 + + + LAW + LAW_826@GraphGeneration.gov + LAW_826 + 12 + 3 + 134.14503636908404 + 82.09870159631103 + + + LAW + LAW_896@GraphGeneration.gov + LAW_896 + 6 + 3 + 43.572318705263505 + 96.01078153760938 + + + LAW + LAW_904@GraphGeneration.gov + LAW_904 + 9 + 3 + 51.85219152240956 + 90.74110578628391 + + + LAW + LAW_909@GraphGeneration.gov + LAW_909 + 12 + 3 + 6.803119455307464 + 86.81528431425468 + + + LAW + LAW_911@GraphGeneration.gov + LAW_911 + 9 + 3 + 9.207096429936195 + 86.36791735321403 + + + LAW + LAW_912@GraphGeneration.gov + LAW_912 + 12 + 3 + 28.36201907779416 + 106.3751983318373 + + + LAW + LAW_913@GraphGeneration.gov + LAW_913 + 11 + 3 + 23.135243540710327 + 92.46513184080581 + + + LAW + LAW_914@GraphGeneration.gov + LAW_914 + 11 + 3 + 57.70165051501299 + 110.5725927113144 + + + LAW + LAW_916@GraphGeneration.gov + LAW_916 + 7 + 3 + 5.953125516136382 + 86.43286429993574 + + + LAW + LAW_982@GraphGeneration.gov + LAW_982 + 6 + 3 + 86.62788512137111 + 102.49486258870202 + + + LAW + LAW_993@GraphGeneration.gov + LAW_993 + 9 + 3 + 116.5310802646451 + 105.80676788897452 + + + LAW + LAW_995@GraphGeneration.gov + LAW_995 + 12 + 3 + 79.55826792030956 + 111.70225488409324 + + + LAW + LAW_1000@GraphGeneration.gov + LAW_1000 + 9 + 3 + 97.40213162697883 + 105.16256686154462 + + + LAW + LAW_1001@GraphGeneration.gov + LAW_1001 + 11 + 3 + 80.28730814417037 + 99.2131776083898 + + + LAW + LAW_1006@GraphGeneration.gov + LAW_1006 + 12 + 3 + 110.65464529802998 + 95.16897359067782 + + + LAW + LAW_1008@GraphGeneration.gov + LAW_1008 + 9 + 3 + 124.04554881147058 + 91.40762054359051 + + + LAW + LAW_1073@GraphGeneration.gov + LAW_1073 + 9 + 3 + 158.5898586824876 + 106.00428041263571 + + + LAW + LAW_1080@GraphGeneration.gov + LAW_1080 + 9 + 3 + 148.5469302637944 + 85.77324190455998 + + + LAW + LAW_1081@GraphGeneration.gov + LAW_1081 + 9 + 3 + 145.76070198695342 + 93.90787679918888 + + + LAW + LAW_1083@GraphGeneration.gov + LAW_1083 + 6 + 3 + 173.7290593348129 + 109.27816138651801 + + + LAW + LAW_1084@GraphGeneration.gov + LAW_1084 + 6 + 3 + 140.58033030926737 + 114.26837623992078 + + + LAW + LAW_1089@GraphGeneration.gov + LAW_1089 + 6 + 3 + 150.61924196004242 + 106.4619191165991 + + + LAW + LAW_1090@GraphGeneration.gov + LAW_1090 + 11 + 3 + 161.20854914454037 + 90.91281815586285 + + + LAW + LAW_1091@GraphGeneration.gov + LAW_1091 + 8 + 3 + 142.57131085638966 + 107.28364639055832 + + + LAW + LAW_1097@GraphGeneration.gov + LAW_1097 + 6 + 3 + 170.22894678740872 + 99.71596415514578 + + + LAW + LAW_1166@GraphGeneration.gov + LAW_1166 + 11 + 3 + 2.937502809967718 + 121.7220574209176 + + + LAW + LAW_1167@GraphGeneration.gov + LAW_1167 + 10 + 3 + 62.51202066810681 + 135.16066163815907 + + + LAW + LAW_1169@GraphGeneration.gov + LAW_1169 + 8 + 3 + 58.7617221976189 + 120.38198846039155 + + + LAW + LAW_1171@GraphGeneration.gov + LAW_1171 + 6 + 3 + 14.736707186848127 + 114.34647137652193 + + + LAW + LAW_1178@GraphGeneration.gov + LAW_1178 + 7 + 3 + 9.105017285043235 + 141.82772228840665 + + + LAW + LAW_1181@GraphGeneration.gov + LAW_1181 + 7 + 3 + 62.716352023949206 + 134.63289832943178 + + + LAW + LAW_1188@GraphGeneration.gov + LAW_1188 + 12 + 3 + 33.50231953337768 + 129.0925665990062 + + + LAW + LAW_1189@GraphGeneration.gov + LAW_1189 + 9 + 3 + 64.22681670790854 + 141.5298639637829 + + + LAW + LAW_1190@GraphGeneration.gov + LAW_1190 + 9 + 3 + 49.26178439699509 + 120.77919161875586 + + + LAW + LAW_1261@GraphGeneration.gov + LAW_1261 + 10 + 3 + 118.67183381973467 + 141.87700457397096 + + + LAW + LAW_1266@GraphGeneration.gov + LAW_1266 + 9 + 3 + 67.57371179210553 + 134.23012271524638 + + + LAW + LAW_1267@GraphGeneration.gov + LAW_1267 + 6 + 3 + 103.21807371631874 + 124.3353191035107 + + + LAW + LAW_1268@GraphGeneration.gov + LAW_1268 + 6 + 3 + 72.70255587200171 + 135.6234188183689 + + + LAW + LAW_1275@GraphGeneration.gov + LAW_1275 + 6 + 3 + 105.4028200864154 + 131.4176231946956 + + + LAW + LAW_1276@GraphGeneration.gov + LAW_1276 + 11 + 3 + 98.79886660177077 + 117.23158045476899 + + + LAW + LAW_1277@GraphGeneration.gov + LAW_1277 + 12 + 3 + 79.60174364891333 + 135.98453069001982 + + + LAW + LAW_1283@GraphGeneration.gov + LAW_1283 + 10 + 3 + 115.41649603935632 + 115.18485749957908 + + + LAW + LAW_1354@GraphGeneration.gov + LAW_1354 + 6 + 3 + 186.31362535596634 + 136.63492516518045 + + + LAW + LAW_1360@GraphGeneration.gov + LAW_1360 + 8 + 3 + 134.56767872738192 + 142.3998313204628 + + + LAW + LAW_1361@GraphGeneration.gov + LAW_1361 + 12 + 3 + 143.78800833431578 + 134.3206665908345 + + + LAW + LAW_1365@GraphGeneration.gov + LAW_1365 + 6 + 3 + 178.98266364814518 + 128.10031099191292 + + + LAW + LAW_1367@GraphGeneration.gov + LAW_1367 + 12 + 3 + 175.08442547799964 + 132.5960132963449 + + + LAW + LAW_1372@GraphGeneration.gov + LAW_1372 + 6 + 3 + 154.40148486111127 + 114.67858824241362 + + + LAW + LAW_1376@GraphGeneration.gov + LAW_1376 + 9 + 3 + 146.90660202590004 + 128.58648425029247 + + + LAW + LAW_1378@GraphGeneration.gov + LAW_1378 + 9 + 3 + 170.14746056831507 + 119.75197989336738 + + + LAW + LAW_1448@GraphGeneration.gov + LAW_1448 + 8 + 3 + 47.49524811614644 + 164.9634412657365 + + + LAW + LAW_1451@GraphGeneration.gov + LAW_1451 + 11 + 3 + 15.519390761773334 + 150.57716128928783 + + + LAW + LAW_1455@GraphGeneration.gov + LAW_1455 + 9 + 3 + 23.995137258045208 + 170.67944642384072 + + + LAW + LAW_1457@GraphGeneration.gov + LAW_1457 + 9 + 3 + 58.43482288662484 + 159.60099694207253 + + + LAW + LAW_1459@GraphGeneration.gov + LAW_1459 + 9 + 3 + 23.040381158262583 + 161.50896526323922 + + + LAW + LAW_1468@GraphGeneration.gov + LAW_1468 + 6 + 3 + 31.08067914170602 + 148.5137775583844 + + + LAW + LAW_1535@GraphGeneration.gov + LAW_1535 + 11 + 3 + 69.74341818060091 + 158.58508213227253 + + + LAW + LAW_1538@GraphGeneration.gov + LAW_1538 + 7 + 3 + 99.42274862286685 + 166.00042774373827 + + + LAW + LAW_1540@GraphGeneration.gov + LAW_1540 + 12 + 3 + 111.55069002231667 + 162.43223768306805 + + + LAW + LAW_1542@GraphGeneration.gov + LAW_1542 + 8 + 3 + 129.1137080071002 + 160.08052538327178 + + + LAW + LAW_1544@GraphGeneration.gov + LAW_1544 + 7 + 3 + 121.99519534146302 + 148.76963070274567 + + + LAW + LAW_1546@GraphGeneration.gov + LAW_1546 + 11 + 3 + 108.98945129083478 + 154.8537491772008 + + + LAW + LAW_1548@GraphGeneration.gov + LAW_1548 + 10 + 3 + 99.81310874172789 + 158.5591408779984 + + + LAW + LAW_1555@GraphGeneration.gov + LAW_1555 + 12 + 3 + 83.33740090223941 + 144.1512530452535 + + + LAW + LAW_1556@GraphGeneration.gov + LAW_1556 + 10 + 3 + 82.04083394856835 + 152.73338847320636 + + + LAW + LAW_1561@GraphGeneration.gov + LAW_1561 + 10 + 3 + 118.4042054938238 + 155.56872985596462 + + + LAW + LAW_1562@GraphGeneration.gov + LAW_1562 + 11 + 3 + 121.69293777170367 + 160.89560302091874 + + + LAW + LAW_1626@GraphGeneration.gov + LAW_1626 + 9 + 3 + 154.7104233814874 + 162.02473457876835 + + + LAW + LAW_1634@GraphGeneration.gov + LAW_1634 + 12 + 3 + 175.83979903708027 + 143.54486139643282 + + + LAW + LAW_1639@GraphGeneration.gov + LAW_1639 + 9 + 3 + 161.38888466846646 + 149.1592706949815 + + + LAW + LAW_1640@GraphGeneration.gov + LAW_1640 + 6 + 3 + 192.67836305469632 + 148.0250184862565 + + + LAW + LAW_1644@GraphGeneration.gov + LAW_1644 + 9 + 3 + 142.17332924687784 + 153.7205975805941 + + + LAW + LAW_1649@GraphGeneration.gov + LAW_1649 + 11 + 3 + 138.45618063609615 + 152.39846342883294 + + + LAW + LAW_1653@GraphGeneration.gov + LAW_1653 + 12 + 3 + 179.80372883729638 + 162.13043888600396 + + + LAW + LAW_1719@GraphGeneration.gov + LAW_1719 + 7 + 3 + 56.42271204375938 + 172.44158338823442 + + + LAW + LAW_1729@GraphGeneration.gov + LAW_1729 + 6 + 3 + 62.875307320453466 + 178.83842824227224 + + + LAW + LAW_1731@GraphGeneration.gov + LAW_1731 + 11 + 3 + 54.89681600603831 + 181.84138531624396 + + + LAW + LAW_1734@GraphGeneration.gov + LAW_1734 + 11 + 3 + 15.56815379672758 + 188.10546521402435 + + + LAW + LAW_1735@GraphGeneration.gov + LAW_1735 + 12 + 3 + 57.7167220652282 + 181.1158349432073 + + + LAW + LAW_1737@GraphGeneration.gov + LAW_1737 + 8 + 3 + 13.565008147552172 + 186.01198865641985 + + + LAW + LAW_1740@GraphGeneration.gov + LAW_1740 + 6 + 3 + 39.922491132907716 + 195.07707992466348 + + + LAW + LAW_1742@GraphGeneration.gov + LAW_1742 + 12 + 3 + 5.883561190185723 + 183.09606644285395 + + + LAW + LAW_1743@GraphGeneration.gov + LAW_1743 + 8 + 3 + 45.87942414080621 + 188.8792540361905 + + + LAW + LAW_1814@GraphGeneration.gov + LAW_1814 + 8 + 3 + 88.17193808859787 + 187.64439975073938 + + + LAW + LAW_1815@GraphGeneration.gov + LAW_1815 + 8 + 3 + 105.25961755153946 + 189.4651771886406 + + + LAW + LAW_1818@GraphGeneration.gov + LAW_1818 + 6 + 3 + 106.30050390078736 + 197.48101928880584 + + + LAW + LAW_1822@GraphGeneration.gov + LAW_1822 + 9 + 3 + 68.70964043744476 + 196.87637705982502 + + + LAW + LAW_1824@GraphGeneration.gov + LAW_1824 + 10 + 3 + 102.18500781239402 + 198.8037318733474 + + + LAW + LAW_1836@GraphGeneration.gov + LAW_1836 + 10 + 3 + 80.68261549121478 + 182.8819371373128 + + + LAW + LAW_1837@GraphGeneration.gov + LAW_1837 + 10 + 3 + 106.27390307381484 + 188.44010781452295 + + + LAW + LAW_1906@GraphGeneration.gov + LAW_1906 + 7 + 3 + 135.9173916467889 + 184.58687613845507 + + + LAW + LAW_1908@GraphGeneration.gov + LAW_1908 + 8 + 3 + 144.25069260094727 + 175.71947904488715 + + + LAW + LAW_1912@GraphGeneration.gov + LAW_1912 + 10 + 3 + 136.4448416831871 + 177.0246308726032 + + + LAW + LAW_1913@GraphGeneration.gov + LAW_1913 + 12 + 3 + 185.53346365132467 + 192.89884181487236 + + + LAW + LAW_1914@GraphGeneration.gov + LAW_1914 + 11 + 3 + 169.5390325045595 + 197.93099519044188 + + + LAW + LAW_1916@GraphGeneration.gov + LAW_1916 + 8 + 3 + 135.02009914729788 + 189.53600038687216 + + + LAW + LAW_1918@GraphGeneration.gov + LAW_1918 + 12 + 3 + 175.23258515471997 + 172.25045782783417 + + + LAW + LAW_1924@GraphGeneration.gov + LAW_1924 + 9 + 3 + 175.52544666265482 + 173.8784706377101 + + + LAW + LAW_1927@GraphGeneration.gov + LAW_1927 + 11 + 3 + 186.16366559255079 + 175.20716209911794 + + + LAW + LAW_1929@GraphGeneration.gov + LAW_1929 + 6 + 3 + 138.54362812102298 + 189.49972187825028 + + + LAW + LAW_1930@GraphGeneration.gov + LAW_1930 + 12 + 3 + 184.7659075083111 + 182.23294573801496 + + + EMS + EMS_3@GraphGeneration.gov + EMS_3 + 6 + 4 + 53.24483808447065 + 10.508163406844558 + + + EMS + EMS_9@GraphGeneration.gov + EMS_9 + 12 + 4 + 43.536217344348536 + 24.94515307065562 + + + EMS + EMS_18@GraphGeneration.gov + EMS_18 + 12 + 4 + 20.585592145589334 + 1.963335437830795 + + + EMS + EMS_21@GraphGeneration.gov + EMS_21 + 7 + 4 + 49.39333874699091 + 27.260678378529693 + + + EMS + EMS_22@GraphGeneration.gov + EMS_22 + 12 + 4 + 30.66544289008124 + 3.1708491941722063 + + + EMS + EMS_26@GraphGeneration.gov + EMS_26 + 6 + 4 + 54.812242570110485 + 4.880447709356856 + + + EMS + EMS_30@GraphGeneration.gov + EMS_30 + 12 + 4 + 20.679494272320877 + 23.137873297043498 + + + EMS + EMS_95@GraphGeneration.gov + EMS_95 + 10 + 4 + 67.09844959043417 + 15.348461860797531 + + + EMS + EMS_97@GraphGeneration.gov + EMS_97 + 12 + 4 + 101.47455853098663 + 4.818347433604215 + + + EMS + EMS_113@GraphGeneration.gov + EMS_113 + 11 + 4 + 107.08234011201256 + 12.995034202571025 + + + EMS + EMS_117@GraphGeneration.gov + EMS_117 + 7 + 4 + 103.77588074594286 + 5.027851382822966 + + + EMS + EMS_121@GraphGeneration.gov + EMS_121 + 8 + 4 + 90.42931519518157 + 27.37502209363067 + + + EMS + EMS_188@GraphGeneration.gov + EMS_188 + 7 + 4 + 137.35038341117257 + 18.385661618007475 + + + EMS + EMS_189@GraphGeneration.gov + EMS_189 + 11 + 4 + 155.50705399058708 + 1.282851146992289 + + + EMS + EMS_191@GraphGeneration.gov + EMS_191 + 6 + 4 + 173.5557633197165 + 9.377588786637608 + + + EMS + EMS_192@GraphGeneration.gov + EMS_192 + 10 + 4 + 187.74804001963034 + 4.10162901992735 + + + EMS + EMS_196@GraphGeneration.gov + EMS_196 + 9 + 4 + 194.92988576046048 + 0.8875584728600553 + + + EMS + EMS_197@GraphGeneration.gov + EMS_197 + 10 + 4 + 197.70724350428077 + 25.421651906255217 + + + EMS + EMS_200@GraphGeneration.gov + EMS_200 + 8 + 4 + 170.08972519244966 + 7.830219124047755 + + + EMS + EMS_203@GraphGeneration.gov + EMS_203 + 7 + 4 + 157.9556762709336 + 25.47157865656048 + + + EMS + EMS_209@GraphGeneration.gov + EMS_209 + 8 + 4 + 183.087215741922 + 6.745611753290036 + + + EMS + EMS_283@GraphGeneration.gov + EMS_283 + 11 + 4 + 59.377740810238684 + 32.284362656233384 + + + EMS + EMS_285@GraphGeneration.gov + EMS_285 + 11 + 4 + 28.84506325975638 + 44.83992502149431 + + + EMS + EMS_288@GraphGeneration.gov + EMS_288 + 8 + 4 + 27.454433621256925 + 45.50708806794397 + + + EMS + EMS_289@GraphGeneration.gov + EMS_289 + 7 + 4 + 46.12662410239461 + 43.34943993091273 + + + EMS + EMS_292@GraphGeneration.gov + EMS_292 + 10 + 4 + 61.2617271116186 + 42.95808531597094 + + + EMS + EMS_295@GraphGeneration.gov + EMS_295 + 9 + 4 + 56.647304640725196 + 32.05026711154803 + + + EMS + EMS_297@GraphGeneration.gov + EMS_297 + 7 + 4 + 2.252543109559276 + 54.3705892260422 + + + EMS + EMS_300@GraphGeneration.gov + EMS_300 + 11 + 4 + 49.54649949416762 + 35.029788163234514 + + + EMS + EMS_302@GraphGeneration.gov + EMS_302 + 9 + 4 + 55.17761742913276 + 55.80660525545005 + + + EMS + EMS_369@GraphGeneration.gov + EMS_369 + 8 + 4 + 67.71652325202682 + 56.30518116250202 + + + EMS + EMS_372@GraphGeneration.gov + EMS_372 + 8 + 4 + 69.40715341272833 + 54.37776910328658 + + + EMS + EMS_373@GraphGeneration.gov + EMS_373 + 6 + 4 + 96.70583122601815 + 34.03822408113237 + + + EMS + EMS_374@GraphGeneration.gov + EMS_374 + 6 + 4 + 82.87577525716355 + 43.64790805877066 + + + EMS + EMS_376@GraphGeneration.gov + EMS_376 + 10 + 4 + 94.43036481424376 + 30.572590336427893 + + + EMS + EMS_383@GraphGeneration.gov + EMS_383 + 9 + 4 + 73.49736241083568 + 55.375611671751294 + + + EMS + EMS_393@GraphGeneration.gov + EMS_393 + 11 + 4 + 108.36949594964787 + 51.10744945508298 + + + EMS + EMS_396@GraphGeneration.gov + EMS_396 + 9 + 4 + 118.84731077587941 + 34.240433570420265 + + + EMS + EMS_397@GraphGeneration.gov + EMS_397 + 9 + 4 + 121.42922106423242 + 40.418163002546144 + + + EMS + EMS_461@GraphGeneration.gov + EMS_461 + 8 + 4 + 142.3429717199221 + 32.43205277210421 + + + EMS + EMS_464@GraphGeneration.gov + EMS_464 + 9 + 4 + 145.6250032735692 + 29.42624261004136 + + + EMS + EMS_465@GraphGeneration.gov + EMS_465 + 6 + 4 + 160.4272736785608 + 56.130535446285776 + + + EMS + EMS_466@GraphGeneration.gov + EMS_466 + 8 + 4 + 152.96341911009316 + 42.567209541427715 + + + EMS + EMS_469@GraphGeneration.gov + EMS_469 + 12 + 4 + 183.74938029766042 + 48.62592528806978 + + + EMS + EMS_470@GraphGeneration.gov + EMS_470 + 6 + 4 + 138.19312318753205 + 56.88232194231173 + + + EMS + EMS_476@GraphGeneration.gov + EMS_476 + 12 + 4 + 154.45285500845708 + 49.93778240534675 + + + EMS + EMS_480@GraphGeneration.gov + EMS_480 + 6 + 4 + 177.62907774270204 + 42.62049677763873 + + + EMS + EMS_486@GraphGeneration.gov + EMS_486 + 7 + 4 + 190.36814174066612 + 38.4913747820717 + + + EMS + EMS_488@GraphGeneration.gov + EMS_488 + 11 + 4 + 165.4902310458936 + 40.03454570385147 + + + EMS + EMS_490@GraphGeneration.gov + EMS_490 + 7 + 4 + 166.92718707600037 + 33.77787232435905 + + + EMS + EMS_553@GraphGeneration.gov + EMS_553 + 6 + 4 + 51.0176877749275 + 65.36429187660782 + + + EMS + EMS_554@GraphGeneration.gov + EMS_554 + 11 + 4 + 48.12242797589202 + 64.774944596099 + + + EMS + EMS_560@GraphGeneration.gov + EMS_560 + 8 + 4 + 31.871387003722734 + 85.45693356780433 + + + EMS + EMS_561@GraphGeneration.gov + EMS_561 + 11 + 4 + 31.035524508828324 + 83.87790437002668 + + + EMS + EMS_563@GraphGeneration.gov + EMS_563 + 6 + 4 + 60.83586759931214 + 57.63284209285437 + + + EMS + EMS_565@GraphGeneration.gov + EMS_565 + 9 + 4 + 62.40014348377313 + 60.6235834577852 + + + EMS + EMS_567@GraphGeneration.gov + EMS_567 + 7 + 4 + 32.73376961322648 + 59.27227662587424 + + + EMS + EMS_569@GraphGeneration.gov + EMS_569 + 10 + 4 + 6.9316409343632115 + 78.91757823948811 + + + EMS + EMS_570@GraphGeneration.gov + EMS_570 + 10 + 4 + 27.563393834232603 + 66.19573828109941 + + + EMS + EMS_571@GraphGeneration.gov + EMS_571 + 12 + 4 + 58.32829541895622 + 65.90189920905799 + + + EMS + EMS_575@GraphGeneration.gov + EMS_575 + 12 + 4 + 40.337478527466686 + 81.31235216864496 + + + EMS + EMS_580@GraphGeneration.gov + EMS_580 + 12 + 4 + 12.907116392176063 + 68.95782967709133 + + + EMS + EMS_645@GraphGeneration.gov + EMS_645 + 10 + 4 + 127.36608681421566 + 85.40522376694827 + + + EMS + EMS_651@GraphGeneration.gov + EMS_651 + 12 + 4 + 79.54201973902939 + 67.83054955064338 + + + EMS + EMS_653@GraphGeneration.gov + EMS_653 + 10 + 4 + 79.72645933859641 + 71.90990201901455 + + + EMS + EMS_662@GraphGeneration.gov + EMS_662 + 10 + 4 + 69.03987428732424 + 72.02296535552023 + + + EMS + EMS_663@GraphGeneration.gov + EMS_663 + 12 + 4 + 123.86726449109733 + 79.39427414805955 + + + EMS + EMS_667@GraphGeneration.gov + EMS_667 + 8 + 4 + 117.91013481795866 + 57.28427678352048 + + + EMS + EMS_672@GraphGeneration.gov + EMS_672 + 8 + 4 + 131.60208518733634 + 60.11143578764488 + + + EMS + EMS_744@GraphGeneration.gov + EMS_744 + 12 + 4 + 146.21385314920795 + 62.88579291553017 + + + EMS + EMS_746@GraphGeneration.gov + EMS_746 + 10 + 4 + 144.36070484873247 + 73.4720832517089 + + + EMS + EMS_753@GraphGeneration.gov + EMS_753 + 7 + 4 + 162.34060522810637 + 80.33970341721127 + + + EMS + EMS_760@GraphGeneration.gov + EMS_760 + 11 + 4 + 163.26529076077313 + 78.98776503702783 + + + EMS + EMS_763@GraphGeneration.gov + EMS_763 + 6 + 4 + 143.2062913884487 + 77.8786581362277 + + + EMS + EMS_764@GraphGeneration.gov + EMS_764 + 8 + 4 + 172.806281405476 + 58.28991999593479 + + + EMS + EMS_841@GraphGeneration.gov + EMS_841 + 9 + 4 + 9.90360517423267 + 99.91385271301793 + + + EMS + EMS_843@GraphGeneration.gov + EMS_843 + 11 + 4 + 17.59351002840813 + 90.75420437949082 + + + EMS + EMS_847@GraphGeneration.gov + EMS_847 + 7 + 4 + 37.13492853761621 + 103.54961327544747 + + + EMS + EMS_850@GraphGeneration.gov + EMS_850 + 6 + 4 + 25.18276691624959 + 99.51253247547461 + + + EMS + EMS_852@GraphGeneration.gov + EMS_852 + 10 + 4 + 39.921888854811876 + 95.76594252258339 + + + EMS + EMS_856@GraphGeneration.gov + EMS_856 + 7 + 4 + 14.225006289165211 + 101.52416764131831 + + + EMS + EMS_924@GraphGeneration.gov + EMS_924 + 9 + 4 + 97.9966043543312 + 86.22430863346132 + + + EMS + EMS_930@GraphGeneration.gov + EMS_930 + 8 + 4 + 79.44045052742682 + 107.81045896954794 + + + EMS + EMS_932@GraphGeneration.gov + EMS_932 + 9 + 4 + 117.33042395389094 + 110.74013328429582 + + + EMS + EMS_934@GraphGeneration.gov + EMS_934 + 7 + 4 + 86.1078877098515 + 96.7331041333813 + + + EMS + EMS_935@GraphGeneration.gov + EMS_935 + 7 + 4 + 108.9841757501919 + 92.65605537246854 + + + EMS + EMS_938@GraphGeneration.gov + EMS_938 + 7 + 4 + 128.66248091765632 + 96.92490420416728 + + + EMS + EMS_939@GraphGeneration.gov + EMS_939 + 10 + 4 + 109.59771460448697 + 104.60619468039584 + + + EMS + EMS_943@GraphGeneration.gov + EMS_943 + 12 + 4 + 130.19431127764625 + 108.91910254351765 + + + EMS + EMS_946@GraphGeneration.gov + EMS_946 + 10 + 4 + 113.9405538673084 + 107.75916538896132 + + + EMS + EMS_1013@GraphGeneration.gov + EMS_1013 + 10 + 4 + 185.00856286096072 + 96.33837623596825 + + + EMS + EMS_1017@GraphGeneration.gov + EMS_1017 + 7 + 4 + 163.32251195772173 + 89.26126152675563 + + + EMS + EMS_1023@GraphGeneration.gov + EMS_1023 + 12 + 4 + 177.9990327258268 + 109.68632041517387 + + + EMS + EMS_1027@GraphGeneration.gov + EMS_1027 + 11 + 4 + 143.92163988557687 + 86.53677346899367 + + + EMS + EMS_1042@GraphGeneration.gov + EMS_1042 + 9 + 4 + 187.59038441075924 + 111.226138139128 + + + EMS + EMS_1105@GraphGeneration.gov + EMS_1105 + 9 + 4 + 53.99840250990526 + 141.29668781476056 + + + EMS + EMS_1107@GraphGeneration.gov + EMS_1107 + 6 + 4 + 51.894961697013585 + 127.13197361480533 + + + EMS + EMS_1115@GraphGeneration.gov + EMS_1115 + 7 + 4 + 38.39548046141305 + 127.25947705228263 + + + EMS + EMS_1116@GraphGeneration.gov + EMS_1116 + 11 + 4 + 57.29677606245432 + 133.02509227564045 + + + EMS + EMS_1124@GraphGeneration.gov + EMS_1124 + 7 + 4 + 47.1575373190595 + 120.30258000184311 + + + EMS + EMS_1131@GraphGeneration.gov + EMS_1131 + 9 + 4 + 4.99426109905646 + 131.55234377977217 + + + EMS + EMS_1134@GraphGeneration.gov + EMS_1134 + 8 + 4 + 32.96304025243062 + 128.04068163904066 + + + EMS + EMS_1199@GraphGeneration.gov + EMS_1199 + 9 + 4 + 88.88460437566258 + 121.67014791058455 + + + EMS + EMS_1205@GraphGeneration.gov + EMS_1205 + 8 + 4 + 122.44407558159767 + 117.21017223529414 + + + EMS + EMS_1209@GraphGeneration.gov + EMS_1209 + 12 + 4 + 105.43772268065399 + 131.32689640899193 + + + EMS + EMS_1212@GraphGeneration.gov + EMS_1212 + 7 + 4 + 133.24955660790903 + 136.44502023662992 + + + EMS + EMS_1214@GraphGeneration.gov + EMS_1214 + 12 + 4 + 126.74038555879602 + 136.4790640010695 + + + EMS + EMS_1289@GraphGeneration.gov + EMS_1289 + 11 + 4 + 136.80254742861703 + 116.37674961633904 + + + EMS + EMS_1291@GraphGeneration.gov + EMS_1291 + 9 + 4 + 139.50734912675182 + 121.12542672002974 + + + EMS + EMS_1292@GraphGeneration.gov + EMS_1292 + 11 + 4 + 156.39606612322584 + 142.12487809621814 + + + EMS + EMS_1293@GraphGeneration.gov + EMS_1293 + 12 + 4 + 158.34026480482842 + 121.02080683216592 + + + EMS + EMS_1304@GraphGeneration.gov + EMS_1304 + 8 + 4 + 187.68523678687737 + 117.67604110488628 + + + EMS + EMS_1306@GraphGeneration.gov + EMS_1306 + 11 + 4 + 134.50591243210525 + 135.26781891443943 + + + EMS + EMS_1311@GraphGeneration.gov + EMS_1311 + 6 + 4 + 166.85326865985033 + 130.06282170367038 + + + EMS + EMS_1312@GraphGeneration.gov + EMS_1312 + 10 + 4 + 135.98832379356503 + 124.23093971170283 + + + EMS + EMS_1382@GraphGeneration.gov + EMS_1382 + 6 + 4 + 32.81735854652071 + 151.7011099294128 + + + EMS + EMS_1384@GraphGeneration.gov + EMS_1384 + 7 + 4 + 59.98059960100839 + 147.64535407712526 + + + EMS + EMS_1391@GraphGeneration.gov + EMS_1391 + 8 + 4 + 31.150588817850764 + 154.7816669954203 + + + EMS + EMS_1399@GraphGeneration.gov + EMS_1399 + 9 + 4 + 34.58648850501979 + 159.84547064241968 + + + EMS + EMS_1400@GraphGeneration.gov + EMS_1400 + 8 + 4 + 41.65738295705316 + 146.46536628542427 + + + EMS + EMS_1401@GraphGeneration.gov + EMS_1401 + 12 + 4 + 31.493972906502993 + 168.22937224933742 + + + EMS + EMS_1477@GraphGeneration.gov + EMS_1477 + 10 + 4 + 125.6538769193017 + 169.78766252909543 + + + EMS + EMS_1480@GraphGeneration.gov + EMS_1480 + 7 + 4 + 70.5891352598934 + 151.95598796686292 + + + EMS + EMS_1481@GraphGeneration.gov + EMS_1481 + 10 + 4 + 100.51416222244805 + 149.7090597420922 + + + EMS + EMS_1482@GraphGeneration.gov + EMS_1482 + 9 + 4 + 105.17666856704929 + 149.86261987201578 + + + EMS + EMS_1495@GraphGeneration.gov + EMS_1495 + 9 + 4 + 99.67957277243755 + 145.69039241957148 + + + EMS + EMS_1497@GraphGeneration.gov + EMS_1497 + 8 + 4 + 66.67177725344992 + 165.18015645643504 + + + EMS + EMS_1565@GraphGeneration.gov + EMS_1565 + 6 + 4 + 173.2044867133069 + 153.53090257170822 + + + EMS + EMS_1570@GraphGeneration.gov + EMS_1570 + 10 + 4 + 172.75445759460854 + 164.03375365740945 + + + EMS + EMS_1572@GraphGeneration.gov + EMS_1572 + 12 + 4 + 138.55030411508318 + 152.26246952280678 + + + EMS + EMS_1573@GraphGeneration.gov + EMS_1573 + 6 + 4 + 154.09903585636442 + 146.34340387235466 + + + EMS + EMS_1586@GraphGeneration.gov + EMS_1586 + 6 + 4 + 181.55204693367656 + 169.72863454173273 + + + EMS + EMS_1587@GraphGeneration.gov + EMS_1587 + 10 + 4 + 188.41484112360288 + 144.49688670004147 + + + EMS + EMS_1588@GraphGeneration.gov + EMS_1588 + 9 + 4 + 170.24392396411596 + 147.83593260673373 + + + EMS + EMS_1590@GraphGeneration.gov + EMS_1590 + 9 + 4 + 166.40104862501136 + 156.76563996100984 + + + EMS + EMS_1594@GraphGeneration.gov + EMS_1594 + 8 + 4 + 159.73279698130204 + 146.9772528863385 + + + EMS + EMS_1666@GraphGeneration.gov + EMS_1666 + 12 + 4 + 35.75679041694992 + 192.60618434321117 + + + EMS + EMS_1667@GraphGeneration.gov + EMS_1667 + 8 + 4 + 43.08679345641496 + 186.95788824873708 + + + EMS + EMS_1670@GraphGeneration.gov + EMS_1670 + 7 + 4 + 61.97559011682774 + 175.8803407773927 + + + EMS + EMS_1673@GraphGeneration.gov + EMS_1673 + 10 + 4 + 46.03013369047653 + 184.8664251808886 + + + EMS + EMS_1676@GraphGeneration.gov + EMS_1676 + 6 + 4 + 27.91669651913825 + 176.17956269994195 + + + EMS + EMS_1685@GraphGeneration.gov + EMS_1685 + 6 + 4 + 33.96105954422363 + 174.5246175753966 + + + EMS + EMS_1749@GraphGeneration.gov + EMS_1749 + 11 + 4 + 82.95128722764773 + 193.78631566758327 + + + EMS + EMS_1752@GraphGeneration.gov + EMS_1752 + 10 + 4 + 110.17336614023718 + 180.73980722474056 + + + EMS + EMS_1754@GraphGeneration.gov + EMS_1754 + 7 + 4 + 117.28024002373783 + 191.4028158632172 + + + EMS + EMS_1760@GraphGeneration.gov + EMS_1760 + 9 + 4 + 117.79506051545647 + 191.41428425151778 + + + EMS + EMS_1762@GraphGeneration.gov + EMS_1762 + 12 + 4 + 128.4268028637448 + 176.16388293629012 + + + EMS + EMS_1763@GraphGeneration.gov + EMS_1763 + 10 + 4 + 102.2615840660514 + 195.37468766535412 + + + EMS + EMS_1768@GraphGeneration.gov + EMS_1768 + 12 + 4 + 105.94677367252892 + 183.6391231898577 + + + EMS + EMS_1776@GraphGeneration.gov + EMS_1776 + 10 + 4 + 114.6114649941751 + 195.68606756672878 + + + EMS + EMS_1777@GraphGeneration.gov + EMS_1777 + 7 + 4 + 80.29538563335726 + 171.61071019524644 + + + EMS + EMS_1841@GraphGeneration.gov + EMS_1841 + 8 + 4 + 150.24976567268692 + 183.14706481229882 + + + EMS + EMS_1843@GraphGeneration.gov + EMS_1843 + 8 + 4 + 167.96568831510194 + 197.57636623522643 + + + EMS + EMS_1845@GraphGeneration.gov + EMS_1845 + 12 + 4 + 153.4208562734183 + 185.53142086873066 + + + EMS + EMS_1851@GraphGeneration.gov + EMS_1851 + 6 + 4 + 137.42944177296155 + 181.9651688028916 + + + EMS + EMS_1858@GraphGeneration.gov + EMS_1858 + 7 + 4 + 169.34338134378285 + 199.49592652177103 + + + EMS + EMS_1861@GraphGeneration.gov + EMS_1861 + 12 + 4 + 153.50651747718126 + 177.76970770863167 + + + EMS + EMS_1865@GraphGeneration.gov + EMS_1865 + 6 + 4 + 195.68680286820876 + 194.86135275161038 + + + EMS + EMS_1866@GraphGeneration.gov + EMS_1866 + 9 + 4 + 147.5353586371011 + 190.8112973773417 + + + EMS + EMS_1867@GraphGeneration.gov + EMS_1867 + 6 + 4 + 147.76528166025935 + 193.74269317872705 + + + EMS + EMS_1868@GraphGeneration.gov + EMS_1868 + 12 + 4 + 169.11794988223016 + 178.28070058186472 + + + EMS + EMS_1869@GraphGeneration.gov + EMS_1869 + 6 + 4 + 166.24147121325922 + 196.9800106219317 + + + FIRE + FIRE_33@GraphGeneration.gov + FIRE_33 + 6 + 4 + 21.86384896501265 + 12.706297498745057 + + + FIRE + FIRE_34@GraphGeneration.gov + FIRE_34 + 10 + 4 + 46.68407327109596 + 3.7294536717682716 + + + FIRE + FIRE_37@GraphGeneration.gov + FIRE_37 + 12 + 4 + 2.9952342460530135 + 27.360020466048336 + + + FIRE + FIRE_38@GraphGeneration.gov + FIRE_38 + 7 + 4 + 57.470024804565796 + 14.804910146411329 + + + FIRE + FIRE_41@GraphGeneration.gov + FIRE_41 + 9 + 4 + 34.40421514687941 + 5.791030626975512 + + + FIRE + FIRE_42@GraphGeneration.gov + FIRE_42 + 8 + 4 + 26.99004129654183 + 1.6540210793832706 + + + FIRE + FIRE_51@GraphGeneration.gov + FIRE_51 + 8 + 4 + 40.31856805276646 + 23.162910088062027 + + + FIRE + FIRE_56@GraphGeneration.gov + FIRE_56 + 9 + 4 + 8.130853244287987 + 0.3942043583160146 + + + FIRE + FIRE_123@GraphGeneration.gov + FIRE_123 + 6 + 4 + 127.24591743887376 + 20.3119684171907 + + + FIRE + FIRE_125@GraphGeneration.gov + FIRE_125 + 11 + 4 + 72.99652789323622 + 15.545992535570653 + + + FIRE + FIRE_128@GraphGeneration.gov + FIRE_128 + 9 + 4 + 83.00175099134913 + 3.39380193352814 + + + FIRE + FIRE_135@GraphGeneration.gov + FIRE_135 + 11 + 4 + 98.30537651259893 + 12.333410447831175 + + + FIRE + FIRE_147@GraphGeneration.gov + FIRE_147 + 7 + 4 + 125.75928096125159 + 19.229851126897948 + + + FIRE + FIRE_148@GraphGeneration.gov + FIRE_148 + 12 + 4 + 120.24014419613614 + 26.689285212960243 + + + FIRE + FIRE_151@GraphGeneration.gov + FIRE_151 + 10 + 4 + 70.43726840946726 + 28.03033703120373 + + + FIRE + FIRE_152@GraphGeneration.gov + FIRE_152 + 10 + 4 + 107.04876350885198 + 13.245124376221034 + + + FIRE + FIRE_220@GraphGeneration.gov + FIRE_220 + 11 + 4 + 142.83082020595936 + 17.30496215370988 + + + FIRE + FIRE_221@GraphGeneration.gov + FIRE_221 + 9 + 4 + 144.8794648334962 + 25.763464171870126 + + + FIRE + FIRE_232@GraphGeneration.gov + FIRE_232 + 7 + 4 + 186.20142348683348 + 25.053136216827678 + + + FIRE + FIRE_235@GraphGeneration.gov + FIRE_235 + 7 + 4 + 154.31492422770648 + 28.537931276724265 + + + FIRE + FIRE_243@GraphGeneration.gov + FIRE_243 + 9 + 4 + 175.8777102319325 + 23.50094242829977 + + + FIRE + FIRE_307@GraphGeneration.gov + FIRE_307 + 11 + 4 + 29.54768907428347 + 31.419078662157116 + + + FIRE + FIRE_310@GraphGeneration.gov + FIRE_310 + 6 + 4 + 56.785341440961105 + 49.054112966342146 + + + FIRE + FIRE_312@GraphGeneration.gov + FIRE_312 + 9 + 4 + 56.91315537658031 + 36.60509977702916 + + + FIRE + FIRE_314@GraphGeneration.gov + FIRE_314 + 10 + 4 + 36.92620981503027 + 49.20420713335341 + + + FIRE + FIRE_316@GraphGeneration.gov + FIRE_316 + 11 + 4 + 16.861255193063386 + 41.83418282392941 + + + FIRE + FIRE_325@GraphGeneration.gov + FIRE_325 + 10 + 4 + 54.47555141786813 + 38.94629249880533 + + + FIRE + FIRE_334@GraphGeneration.gov + FIRE_334 + 11 + 4 + 27.318832979204537 + 50.71307839173744 + + + FIRE + FIRE_406@GraphGeneration.gov + FIRE_406 + 12 + 4 + 74.95068512056072 + 53.345151720823125 + + + FIRE + FIRE_417@GraphGeneration.gov + FIRE_417 + 9 + 4 + 97.63051259259748 + 39.09438515809721 + + + FIRE + FIRE_420@GraphGeneration.gov + FIRE_420 + 7 + 4 + 112.57917556263934 + 55.05910470285616 + + + FIRE + FIRE_426@GraphGeneration.gov + FIRE_426 + 11 + 4 + 72.89368287266299 + 43.220747431939216 + + + FIRE + FIRE_427@GraphGeneration.gov + FIRE_427 + 12 + 4 + 104.08269617142909 + 41.746500975734456 + + + FIRE + FIRE_428@GraphGeneration.gov + FIRE_428 + 6 + 4 + 130.4268660376489 + 52.979823194802194 + + + FIRE + FIRE_493@GraphGeneration.gov + FIRE_493 + 11 + 4 + 142.03349712954684 + 31.777436051178515 + + + FIRE + FIRE_496@GraphGeneration.gov + FIRE_496 + 10 + 4 + 153.082019061538 + 32.16231078182831 + + + FIRE + FIRE_502@GraphGeneration.gov + FIRE_502 + 8 + 4 + 196.11615071911797 + 53.73440897117875 + + + FIRE + FIRE_506@GraphGeneration.gov + FIRE_506 + 11 + 4 + 165.91456652321534 + 56.35096708575563 + + + FIRE + FIRE_508@GraphGeneration.gov + FIRE_508 + 12 + 4 + 140.91939942997348 + 30.471705722767854 + + + FIRE + FIRE_517@GraphGeneration.gov + FIRE_517 + 9 + 4 + 168.42399387933062 + 42.250584197709095 + + + FIRE + FIRE_520@GraphGeneration.gov + FIRE_520 + 9 + 4 + 153.18838063585713 + 35.758625872491955 + + + FIRE + FIRE_586@GraphGeneration.gov + FIRE_586 + 9 + 4 + 34.51841286987225 + 66.72184815546896 + + + FIRE + FIRE_587@GraphGeneration.gov + FIRE_587 + 11 + 4 + 14.733120065526554 + 82.26849458869275 + + + FIRE + FIRE_588@GraphGeneration.gov + FIRE_588 + 7 + 4 + 59.02721935123622 + 84.22345306652036 + + + FIRE + FIRE_591@GraphGeneration.gov + FIRE_591 + 11 + 4 + 12.36023620209954 + 78.75015608211942 + + + FIRE + FIRE_593@GraphGeneration.gov + FIRE_593 + 8 + 4 + 14.683938442905788 + 85.30590011237534 + + + FIRE + FIRE_598@GraphGeneration.gov + FIRE_598 + 10 + 4 + 34.30175132193602 + 65.70861996388126 + + + FIRE + FIRE_599@GraphGeneration.gov + FIRE_599 + 10 + 4 + 8.74971106371083 + 61.60015550715388 + + + FIRE + FIRE_604@GraphGeneration.gov + FIRE_604 + 7 + 4 + 17.771313505709426 + 76.79723594244719 + + + FIRE + FIRE_605@GraphGeneration.gov + FIRE_605 + 12 + 4 + 48.459074814971316 + 75.29214243416345 + + + FIRE + FIRE_609@GraphGeneration.gov + FIRE_609 + 10 + 4 + 26.171169484109093 + 63.20631304206485 + + + FIRE + FIRE_610@GraphGeneration.gov + FIRE_610 + 12 + 4 + 38.428349457853436 + 71.33727032829734 + + + FIRE + FIRE_675@GraphGeneration.gov + FIRE_675 + 6 + 4 + 73.35404910839738 + 59.2577655696629 + + + FIRE + FIRE_682@GraphGeneration.gov + FIRE_682 + 11 + 4 + 93.51249409807744 + 69.18932770763297 + + + FIRE + FIRE_684@GraphGeneration.gov + FIRE_684 + 11 + 4 + 85.85955122083664 + 67.76246278866998 + + + FIRE + FIRE_690@GraphGeneration.gov + FIRE_690 + 10 + 4 + 127.33673296977145 + 74.80635329213771 + + + FIRE + FIRE_691@GraphGeneration.gov + FIRE_691 + 10 + 4 + 86.56800888933157 + 77.29461380525763 + + + FIRE + FIRE_692@GraphGeneration.gov + FIRE_692 + 8 + 4 + 79.95238247553225 + 63.97291159641252 + + + FIRE + FIRE_700@GraphGeneration.gov + FIRE_700 + 11 + 4 + 68.21339898378758 + 72.92101101002336 + + + FIRE + FIRE_777@GraphGeneration.gov + FIRE_777 + 9 + 4 + 144.32335965968247 + 79.1234258313943 + + + FIRE + FIRE_779@GraphGeneration.gov + FIRE_779 + 10 + 4 + 138.07216317049378 + 73.7613857280388 + + + FIRE + FIRE_780@GraphGeneration.gov + FIRE_780 + 8 + 4 + 150.8500435787376 + 65.49669327526176 + + + FIRE + FIRE_785@GraphGeneration.gov + FIRE_785 + 10 + 4 + 180.88626472936502 + 59.5531895476496 + + + FIRE + FIRE_786@GraphGeneration.gov + FIRE_786 + 12 + 4 + 181.07678990227413 + 60.566654432789285 + + + FIRE + FIRE_789@GraphGeneration.gov + FIRE_789 + 8 + 4 + 153.6259132308806 + 57.555439171792095 + + + FIRE + FIRE_790@GraphGeneration.gov + FIRE_790 + 12 + 4 + 158.04379932277152 + 62.061212910470935 + + + FIRE + FIRE_792@GraphGeneration.gov + FIRE_792 + 9 + 4 + 186.10032966901713 + 63.93587562461333 + + + FIRE + FIRE_795@GraphGeneration.gov + FIRE_795 + 10 + 4 + 158.12959091297563 + 66.00131475993592 + + + FIRE + FIRE_861@GraphGeneration.gov + FIRE_861 + 8 + 4 + 54.221929301643755 + 108.00261094248663 + + + FIRE + FIRE_865@GraphGeneration.gov + FIRE_865 + 10 + 4 + 56.56537988762875 + 87.20194237834248 + + + FIRE + FIRE_866@GraphGeneration.gov + FIRE_866 + 12 + 4 + 16.20089853211641 + 104.49810815331817 + + + FIRE + FIRE_868@GraphGeneration.gov + FIRE_868 + 12 + 4 + 31.210510125896672 + 98.29155469070714 + + + FIRE + FIRE_877@GraphGeneration.gov + FIRE_877 + 12 + 4 + 24.256519970534228 + 89.79711388740436 + + + FIRE + FIRE_884@GraphGeneration.gov + FIRE_884 + 10 + 4 + 47.499517389951635 + 94.06034885194913 + + + FIRE + FIRE_951@GraphGeneration.gov + FIRE_951 + 8 + 4 + 116.28573043865029 + 103.16905407163257 + + + FIRE + FIRE_953@GraphGeneration.gov + FIRE_953 + 11 + 4 + 70.69991828417247 + 97.35356828176887 + + + FIRE + FIRE_956@GraphGeneration.gov + FIRE_956 + 9 + 4 + 86.3170040653172 + 89.82713518041672 + + + FIRE + FIRE_957@GraphGeneration.gov + FIRE_957 + 6 + 4 + 132.24988176713327 + 97.80389255349479 + + + FIRE + FIRE_964@GraphGeneration.gov + FIRE_964 + 12 + 4 + 69.49025539673235 + 86.72967630121181 + + + FIRE + FIRE_973@GraphGeneration.gov + FIRE_973 + 12 + 4 + 75.6079539561635 + 109.18549987562326 + + + FIRE + FIRE_979@GraphGeneration.gov + FIRE_979 + 12 + 4 + 99.25034210203134 + 108.67846604252655 + + + FIRE + FIRE_1047@GraphGeneration.gov + FIRE_1047 + 9 + 4 + 198.80583416939658 + 99.58171473145428 + + + FIRE + FIRE_1048@GraphGeneration.gov + FIRE_1048 + 11 + 4 + 190.54022038060822 + 113.47273360645954 + + + FIRE + FIRE_1051@GraphGeneration.gov + FIRE_1051 + 11 + 4 + 158.64294198109272 + 99.23334069283919 + + + FIRE + FIRE_1056@GraphGeneration.gov + FIRE_1056 + 12 + 4 + 154.8832904289523 + 97.71084050276066 + + + FIRE + FIRE_1057@GraphGeneration.gov + FIRE_1057 + 8 + 4 + 143.8296434790895 + 108.48713535999178 + + + FIRE + FIRE_1070@GraphGeneration.gov + FIRE_1070 + 12 + 4 + 135.93810431099138 + 101.03668869153474 + + + FIRE + FIRE_1071@GraphGeneration.gov + FIRE_1071 + 11 + 4 + 136.22182151026436 + 105.64844037499932 + + + FIRE + FIRE_1137@GraphGeneration.gov + FIRE_1137 + 8 + 4 + 11.307526423023573 + 133.69659722298272 + + + FIRE + FIRE_1138@GraphGeneration.gov + FIRE_1138 + 6 + 4 + 14.82527995860652 + 140.56561594701424 + + + FIRE + FIRE_1145@GraphGeneration.gov + FIRE_1145 + 11 + 4 + 23.638146631040144 + 138.72145102557985 + + + FIRE + FIRE_1152@GraphGeneration.gov + FIRE_1152 + 9 + 4 + 61.085626549431176 + 132.8495168780405 + + + FIRE + FIRE_1158@GraphGeneration.gov + FIRE_1158 + 9 + 4 + 44.11342148321988 + 121.48371497444404 + + + FIRE + FIRE_1164@GraphGeneration.gov + FIRE_1164 + 11 + 4 + 50.689705523387644 + 135.49522398821784 + + + FIRE + FIRE_1228@GraphGeneration.gov + FIRE_1228 + 12 + 4 + 101.92276182537017 + 142.63855846027596 + + + FIRE + FIRE_1229@GraphGeneration.gov + FIRE_1229 + 8 + 4 + 122.79003220255753 + 117.10963622243818 + + + FIRE + FIRE_1230@GraphGeneration.gov + FIRE_1230 + 11 + 4 + 121.66168687710288 + 128.16411882610458 + + + FIRE + FIRE_1231@GraphGeneration.gov + FIRE_1231 + 8 + 4 + 122.64362590426023 + 140.39618032057368 + + + FIRE + FIRE_1236@GraphGeneration.gov + FIRE_1236 + 8 + 4 + 132.64418369479057 + 125.8542802012132 + + + FIRE + FIRE_1240@GraphGeneration.gov + FIRE_1240 + 6 + 4 + 90.01715768968029 + 132.23830437958017 + + + FIRE + FIRE_1241@GraphGeneration.gov + FIRE_1241 + 10 + 4 + 79.35522572302315 + 140.95254295983065 + + + FIRE + FIRE_1245@GraphGeneration.gov + FIRE_1245 + 8 + 4 + 67.30844496937773 + 117.45120041962615 + + + FIRE + FIRE_1247@GraphGeneration.gov + FIRE_1247 + 8 + 4 + 106.02046781775287 + 122.67724658166941 + + + FIRE + FIRE_1250@GraphGeneration.gov + FIRE_1250 + 6 + 4 + 72.46822105462991 + 120.79691477921035 + + + FIRE + FIRE_1255@GraphGeneration.gov + FIRE_1255 + 12 + 4 + 120.35273025326498 + 129.74209541193068 + + + FIRE + FIRE_1328@GraphGeneration.gov + FIRE_1328 + 7 + 4 + 177.05575433352516 + 124.98355515657879 + + + FIRE + FIRE_1330@GraphGeneration.gov + FIRE_1330 + 10 + 4 + 198.23995638496376 + 139.8680474579637 + + + FIRE + FIRE_1332@GraphGeneration.gov + FIRE_1332 + 10 + 4 + 175.1835953578094 + 123.86810093748925 + + + FIRE + FIRE_1335@GraphGeneration.gov + FIRE_1335 + 6 + 4 + 148.25908574468286 + 138.65523857922912 + + + FIRE + FIRE_1344@GraphGeneration.gov + FIRE_1344 + 8 + 4 + 199.66536603033006 + 136.68657184157178 + + + FIRE + FIRE_1345@GraphGeneration.gov + FIRE_1345 + 10 + 4 + 147.14867217635182 + 136.49296092354453 + + + FIRE + FIRE_1414@GraphGeneration.gov + FIRE_1414 + 9 + 4 + 1.1951308028675278 + 151.5544374641478 + + + FIRE + FIRE_1419@GraphGeneration.gov + FIRE_1419 + 10 + 4 + 22.452025015618933 + 151.82537574434784 + + + FIRE + FIRE_1422@GraphGeneration.gov + FIRE_1422 + 6 + 4 + 25.123291471299247 + 158.25827062995683 + + + FIRE + FIRE_1437@GraphGeneration.gov + FIRE_1437 + 9 + 4 + 46.33827199106282 + 154.53712582686052 + + + FIRE + FIRE_1508@GraphGeneration.gov + FIRE_1508 + 7 + 4 + 132.99999046020235 + 165.7068508692815 + + + FIRE + FIRE_1510@GraphGeneration.gov + FIRE_1510 + 11 + 4 + 67.3509572589103 + 163.2153719396738 + + + FIRE + FIRE_1513@GraphGeneration.gov + FIRE_1513 + 12 + 4 + 103.379534953276 + 169.33384368156788 + + + FIRE + FIRE_1516@GraphGeneration.gov + FIRE_1516 + 7 + 4 + 73.05356962187886 + 156.88308248545925 + + + FIRE + FIRE_1524@GraphGeneration.gov + FIRE_1524 + 11 + 4 + 125.34646435136844 + 153.13331378444678 + + + FIRE + FIRE_1605@GraphGeneration.gov + FIRE_1605 + 7 + 4 + 136.22050508147333 + 166.633881914367 + + + FIRE + FIRE_1608@GraphGeneration.gov + FIRE_1608 + 10 + 4 + 186.32932761150843 + 146.07142894738672 + + + FIRE + FIRE_1617@GraphGeneration.gov + FIRE_1617 + 9 + 4 + 182.17232159514504 + 148.50924876837897 + + + FIRE + FIRE_1687@GraphGeneration.gov + FIRE_1687 + 11 + 4 + 62.06831828656365 + 173.64580883198747 + + + FIRE + FIRE_1689@GraphGeneration.gov + FIRE_1689 + 9 + 4 + 42.66928152311478 + 193.15487230344382 + + + FIRE + FIRE_1694@GraphGeneration.gov + FIRE_1694 + 12 + 4 + 66.37314672214534 + 181.51027264544862 + + + FIRE + FIRE_1695@GraphGeneration.gov + FIRE_1695 + 12 + 4 + 61.74492519617573 + 177.70969087490977 + + + FIRE + FIRE_1699@GraphGeneration.gov + FIRE_1699 + 11 + 4 + 52.602066842702136 + 180.86784384781396 + + + FIRE + FIRE_1711@GraphGeneration.gov + FIRE_1711 + 11 + 4 + 16.564135944854833 + 179.39626167748963 + + + FIRE + FIRE_1713@GraphGeneration.gov + FIRE_1713 + 10 + 4 + 37.29222540988041 + 172.79990604677437 + + + FIRE + FIRE_1716@GraphGeneration.gov + FIRE_1716 + 11 + 4 + 0.3947755885482426 + 180.2489970388754 + + + FIRE + FIRE_1779@GraphGeneration.gov + FIRE_1779 + 9 + 4 + 86.90057566503052 + 186.07947234675234 + + + FIRE + FIRE_1781@GraphGeneration.gov + FIRE_1781 + 12 + 4 + 100.61794594104346 + 180.0050501795499 + + + FIRE + FIRE_1783@GraphGeneration.gov + FIRE_1783 + 6 + 4 + 104.33849286226716 + 192.16609169571595 + + + FIRE + FIRE_1788@GraphGeneration.gov + FIRE_1788 + 10 + 4 + 132.61066968431027 + 173.29094313784756 + + + FIRE + FIRE_1789@GraphGeneration.gov + FIRE_1789 + 8 + 4 + 97.66699452207816 + 196.46594529548756 + + + FIRE + FIRE_1790@GraphGeneration.gov + FIRE_1790 + 11 + 4 + 88.22819026114014 + 193.99414637026476 + + + FIRE + FIRE_1793@GraphGeneration.gov + FIRE_1793 + 6 + 4 + 102.24917361847233 + 192.86358243257695 + + + FIRE + FIRE_1795@GraphGeneration.gov + FIRE_1795 + 10 + 4 + 67.8356716754772 + 185.13768773466902 + + + FIRE + FIRE_1800@GraphGeneration.gov + FIRE_1800 + 7 + 4 + 74.19959452898131 + 188.11652131391853 + + + FIRE + FIRE_1872@GraphGeneration.gov + FIRE_1872 + 8 + 4 + 167.69961027216027 + 176.04396928588523 + + + FIRE + FIRE_1878@GraphGeneration.gov + FIRE_1878 + 7 + 4 + 159.65632592638505 + 199.4855944295336 + + + FIRE + FIRE_1885@GraphGeneration.gov + FIRE_1885 + 10 + 4 + 168.28271204024318 + 190.59191075397726 + + + FIRE + FIRE_1890@GraphGeneration.gov + FIRE_1890 + 9 + 4 + 152.69179485719667 + 184.0601135037577 + + + FIRE + FIRE_1892@GraphGeneration.gov + FIRE_1892 + 12 + 4 + 170.30873501066236 + 179.2304033833393 + + + FIRE + FIRE_1893@GraphGeneration.gov + FIRE_1893 + 10 + 4 + 137.79076068198762 + 182.82015108799476 + + + FIRE + FIRE_1898@GraphGeneration.gov + FIRE_1898 + 7 + 4 + 190.47419124691535 + 182.68024838145203 + + + LAW + LAW_66@GraphGeneration.gov + LAW_66 + 10 + 4 + 63.42048895676847 + 24.245021855164037 + + + LAW + LAW_68@GraphGeneration.gov + LAW_68 + 11 + 4 + 59.239158420503834 + 6.166557880356265 + + + LAW + LAW_70@GraphGeneration.gov + LAW_70 + 11 + 4 + 35.40197143583299 + 26.21333008034249 + + + LAW + LAW_75@GraphGeneration.gov + LAW_75 + 11 + 4 + 48.96934233276657 + 23.476727482934642 + + + LAW + LAW_77@GraphGeneration.gov + LAW_77 + 6 + 4 + 22.724044316955993 + 4.280504890600831 + + + LAW + LAW_83@GraphGeneration.gov + LAW_83 + 7 + 4 + 16.16271102687004 + 0.9989387110420633 + + + LAW + LAW_86@GraphGeneration.gov + LAW_86 + 12 + 4 + 5.172746657948927 + 6.261769014994877 + + + LAW + LAW_157@GraphGeneration.gov + LAW_157 + 11 + 4 + 108.11765627623285 + 8.157781466497434 + + + LAW + LAW_166@GraphGeneration.gov + LAW_166 + 6 + 4 + 97.5085764966101 + 1.5397444761907473 + + + LAW + LAW_171@GraphGeneration.gov + LAW_171 + 12 + 4 + 87.00907884673197 + 17.253137681951817 + + + LAW + LAW_175@GraphGeneration.gov + LAW_175 + 6 + 4 + 91.52962030737172 + 6.251896644016419 + + + LAW + LAW_181@GraphGeneration.gov + LAW_181 + 8 + 4 + 73.70147614306195 + 1.8568164597517598 + + + LAW + LAW_182@GraphGeneration.gov + LAW_182 + 6 + 4 + 73.18052020035323 + 25.446458356041667 + + + LAW + LAW_245@GraphGeneration.gov + LAW_245 + 11 + 4 + 184.24122944754868 + 1.6898867102948412 + + + LAW + LAW_251@GraphGeneration.gov + LAW_251 + 11 + 4 + 174.5349527178175 + 3.541015092436999 + + + LAW + LAW_258@GraphGeneration.gov + LAW_258 + 7 + 4 + 180.9128070230489 + 3.720141314217724 + + + LAW + LAW_263@GraphGeneration.gov + LAW_263 + 7 + 4 + 168.68092968004206 + 16.21162896295414 + + + LAW + LAW_267@GraphGeneration.gov + LAW_267 + 11 + 4 + 137.4026741335526 + 2.9717578086010104 + + + LAW + LAW_272@GraphGeneration.gov + LAW_272 + 9 + 4 + 199.08695800931832 + 24.08753824799598 + + + LAW + LAW_337@GraphGeneration.gov + LAW_337 + 12 + 4 + 11.535790114738525 + 52.77013380900394 + + + LAW + LAW_341@GraphGeneration.gov + LAW_341 + 8 + 4 + 4.222646601953572 + 34.06531693770061 + + + LAW + LAW_346@GraphGeneration.gov + LAW_346 + 12 + 4 + 11.542857704635228 + 43.990280252906985 + + + LAW + LAW_347@GraphGeneration.gov + LAW_347 + 10 + 4 + 47.9547319747305 + 51.235099535753974 + + + LAW + LAW_349@GraphGeneration.gov + LAW_349 + 7 + 4 + 35.884236199619444 + 52.13520056242386 + + + LAW + LAW_354@GraphGeneration.gov + LAW_354 + 6 + 4 + 56.990269034630764 + 29.108986778371516 + + + LAW + LAW_356@GraphGeneration.gov + LAW_356 + 9 + 4 + 64.17244697269035 + 39.731380335945275 + + + LAW + LAW_358@GraphGeneration.gov + LAW_358 + 12 + 4 + 29.708989993718124 + 56.414846368276585 + + + LAW + LAW_429@GraphGeneration.gov + LAW_429 + 12 + 4 + 84.71793482248 + 42.83487723082321 + + + LAW + LAW_431@GraphGeneration.gov + LAW_431 + 8 + 4 + 121.58398021512647 + 49.272330806741785 + + + LAW + LAW_432@GraphGeneration.gov + LAW_432 + 6 + 4 + 94.46033235132964 + 45.72706861164842 + + + LAW + LAW_436@GraphGeneration.gov + LAW_436 + 12 + 4 + 68.37913917024348 + 42.59451470786652 + + + LAW + LAW_439@GraphGeneration.gov + LAW_439 + 9 + 4 + 83.7038525092343 + 30.52748639080075 + + + LAW + LAW_443@GraphGeneration.gov + LAW_443 + 7 + 4 + 78.98372773566652 + 47.56544786119416 + + + LAW + LAW_451@GraphGeneration.gov + LAW_451 + 10 + 4 + 96.73736539911722 + 31.2152474339838 + + + LAW + LAW_452@GraphGeneration.gov + LAW_452 + 9 + 4 + 131.30840591943144 + 29.18165858496081 + + + LAW + LAW_523@GraphGeneration.gov + LAW_523 + 10 + 4 + 185.66587058702356 + 46.29000658143987 + + + LAW + LAW_525@GraphGeneration.gov + LAW_525 + 11 + 4 + 166.39629773128433 + 50.55848740156436 + + + LAW + LAW_532@GraphGeneration.gov + LAW_532 + 7 + 4 + 134.5950841371236 + 34.30335524924456 + + + LAW + LAW_535@GraphGeneration.gov + LAW_535 + 12 + 4 + 154.22044996311377 + 45.14400285059752 + + + LAW + LAW_538@GraphGeneration.gov + LAW_538 + 10 + 4 + 141.89699105251117 + 39.13492449934068 + + + LAW + LAW_547@GraphGeneration.gov + LAW_547 + 12 + 4 + 192.17399971951397 + 35.32157966968206 + + + LAW + LAW_548@GraphGeneration.gov + LAW_548 + 9 + 4 + 197.75537870990286 + 53.069026333587146 + + + LAW + LAW_632@GraphGeneration.gov + LAW_632 + 9 + 4 + 14.704066765743807 + 73.98645095855372 + + + LAW + LAW_635@GraphGeneration.gov + LAW_635 + 12 + 4 + 53.15162288877539 + 79.3938924746252 + + + LAW + LAW_640@GraphGeneration.gov + LAW_640 + 8 + 4 + 63.33628784289463 + 79.72607640121235 + + + LAW + LAW_706@GraphGeneration.gov + LAW_706 + 10 + 4 + 72.66442849911955 + 62.227526587300375 + + + LAW + LAW_715@GraphGeneration.gov + LAW_715 + 12 + 4 + 94.84726270445668 + 62.983006681904484 + + + LAW + LAW_716@GraphGeneration.gov + LAW_716 + 7 + 4 + 98.94289102151541 + 75.78082553550601 + + + LAW + LAW_718@GraphGeneration.gov + LAW_718 + 12 + 4 + 106.77221230432309 + 63.49412541709651 + + + LAW + LAW_719@GraphGeneration.gov + LAW_719 + 11 + 4 + 94.83941575571744 + 60.821812956556734 + + + LAW + LAW_720@GraphGeneration.gov + LAW_720 + 10 + 4 + 117.32337419561239 + 74.15800828944579 + + + LAW + LAW_724@GraphGeneration.gov + LAW_724 + 11 + 4 + 85.08408284987226 + 78.39380277074066 + + + LAW + LAW_725@GraphGeneration.gov + LAW_725 + 10 + 4 + 116.13647230818687 + 73.49689364802569 + + + LAW + LAW_728@GraphGeneration.gov + LAW_728 + 12 + 4 + 126.28710091682808 + 84.57294369376224 + + + LAW + LAW_734@GraphGeneration.gov + LAW_734 + 6 + 4 + 120.34126685456073 + 57.52351463656875 + + + LAW + LAW_797@GraphGeneration.gov + LAW_797 + 6 + 4 + 194.37315736605856 + 58.973281466837896 + + + LAW + LAW_810@GraphGeneration.gov + LAW_810 + 11 + 4 + 172.06795253400384 + 73.41919458802376 + + + LAW + LAW_817@GraphGeneration.gov + LAW_817 + 10 + 4 + 133.88320303723276 + 69.97162944823975 + + + LAW + LAW_823@GraphGeneration.gov + LAW_823 + 8 + 4 + 190.40048258636745 + 69.23063582849419 + + + LAW + LAW_825@GraphGeneration.gov + LAW_825 + 11 + 4 + 138.58695820862764 + 63.425843108594535 + + + LAW + LAW_892@GraphGeneration.gov + LAW_892 + 9 + 4 + 3.8050363954196107 + 105.41583301498747 + + + LAW + LAW_897@GraphGeneration.gov + LAW_897 + 11 + 4 + 28.792659186144437 + 101.97188341391015 + + + LAW + LAW_901@GraphGeneration.gov + LAW_901 + 11 + 4 + 39.92899914714616 + 108.13336428417857 + + + LAW + LAW_903@GraphGeneration.gov + LAW_903 + 12 + 4 + 8.844491697977341 + 103.32586587522968 + + + LAW + LAW_905@GraphGeneration.gov + LAW_905 + 11 + 4 + 4.242286062427944 + 95.79744521642553 + + + LAW + LAW_907@GraphGeneration.gov + LAW_907 + 12 + 4 + 40.26824001585289 + 95.75268891857432 + + + LAW + LAW_915@GraphGeneration.gov + LAW_915 + 7 + 4 + 61.35582493868902 + 97.49279894037022 + + + LAW + LAW_917@GraphGeneration.gov + LAW_917 + 7 + 4 + 38.987537814686114 + 113.32503619989595 + + + LAW + LAW_981@GraphGeneration.gov + LAW_981 + 11 + 4 + 110.22397209795936 + 111.1286343381777 + + + LAW + LAW_989@GraphGeneration.gov + LAW_989 + 6 + 4 + 83.25677903750633 + 104.72894673674189 + + + LAW + LAW_991@GraphGeneration.gov + LAW_991 + 12 + 4 + 107.02743459484317 + 88.92702614741327 + + + LAW + LAW_992@GraphGeneration.gov + LAW_992 + 11 + 4 + 106.57806208272369 + 88.81888797937881 + + + LAW + LAW_1009@GraphGeneration.gov + LAW_1009 + 6 + 4 + 69.91982306677772 + 104.42070409430113 + + + LAW + LAW_1010@GraphGeneration.gov + LAW_1010 + 9 + 4 + 122.85824901915477 + 96.66697384680654 + + + LAW + LAW_1077@GraphGeneration.gov + LAW_1077 + 12 + 4 + 186.46218530311504 + 109.42589330972777 + + + LAW + LAW_1082@GraphGeneration.gov + LAW_1082 + 7 + 4 + 148.50568207990705 + 98.97194135909866 + + + LAW + LAW_1085@GraphGeneration.gov + LAW_1085 + 11 + 4 + 136.5762222103513 + 111.62716222852154 + + + LAW + LAW_1092@GraphGeneration.gov + LAW_1092 + 7 + 4 + 172.94128622803478 + 95.90967109757501 + + + LAW + LAW_1093@GraphGeneration.gov + LAW_1093 + 6 + 4 + 194.1223013412635 + 103.39158210502868 + + + LAW + LAW_1172@GraphGeneration.gov + LAW_1172 + 10 + 4 + 35.90540902269552 + 129.65628867032532 + + + LAW + LAW_1174@GraphGeneration.gov + LAW_1174 + 11 + 4 + 2.816934988338571 + 125.93108259215286 + + + LAW + LAW_1177@GraphGeneration.gov + LAW_1177 + 9 + 4 + 47.85827976297634 + 132.46184126217872 + + + LAW + LAW_1182@GraphGeneration.gov + LAW_1182 + 9 + 4 + 30.65965630021528 + 125.0034039858106 + + + LAW + LAW_1184@GraphGeneration.gov + LAW_1184 + 10 + 4 + 0.24356241276023058 + 141.18566397951784 + + + LAW + LAW_1187@GraphGeneration.gov + LAW_1187 + 9 + 4 + 25.45351075593728 + 134.35460072550367 + + + LAW + LAW_1191@GraphGeneration.gov + LAW_1191 + 10 + 4 + 31.899504073471814 + 134.79505368971445 + + + LAW + LAW_1259@GraphGeneration.gov + LAW_1259 + 12 + 4 + 106.24299157453046 + 129.25725788372105 + + + LAW + LAW_1260@GraphGeneration.gov + LAW_1260 + 10 + 4 + 104.08869196334811 + 142.12652357916903 + + + LAW + LAW_1264@GraphGeneration.gov + LAW_1264 + 9 + 4 + 99.68308387350976 + 135.64153899232227 + + + LAW + LAW_1271@GraphGeneration.gov + LAW_1271 + 6 + 4 + 131.99556893104497 + 138.12024913163907 + + + LAW + LAW_1286@GraphGeneration.gov + LAW_1286 + 10 + 4 + 84.83603738606048 + 119.53466154436816 + + + LAW + LAW_1349@GraphGeneration.gov + LAW_1349 + 7 + 4 + 183.84299802759978 + 138.7553299405073 + + + LAW + LAW_1351@GraphGeneration.gov + LAW_1351 + 9 + 4 + 168.50376927020488 + 128.42819510458378 + + + LAW + LAW_1355@GraphGeneration.gov + LAW_1355 + 7 + 4 + 163.25143136840742 + 124.00791147454912 + + + LAW + LAW_1364@GraphGeneration.gov + LAW_1364 + 9 + 4 + 179.0302099668044 + 139.38984600984043 + + + LAW + LAW_1366@GraphGeneration.gov + LAW_1366 + 8 + 4 + 134.11821902701857 + 118.67831015357127 + + + LAW + LAW_1370@GraphGeneration.gov + LAW_1370 + 8 + 4 + 150.6127558643724 + 117.2240106850402 + + + LAW + LAW_1373@GraphGeneration.gov + LAW_1373 + 10 + 4 + 155.6818749212738 + 116.37949861080722 + + + LAW + LAW_1374@GraphGeneration.gov + LAW_1374 + 11 + 4 + 141.516776767036 + 138.326350619266 + + + LAW + LAW_1375@GraphGeneration.gov + LAW_1375 + 12 + 4 + 186.08113509119414 + 123.97708019180509 + + + LAW + LAW_1441@GraphGeneration.gov + LAW_1441 + 11 + 4 + 1.43463511129438 + 168.7070477839887 + + + LAW + LAW_1442@GraphGeneration.gov + LAW_1442 + 8 + 4 + 34.61750625259352 + 151.9009243519754 + + + LAW + LAW_1449@GraphGeneration.gov + LAW_1449 + 8 + 4 + 10.611985578985225 + 171.07741083136003 + + + LAW + LAW_1453@GraphGeneration.gov + LAW_1453 + 6 + 4 + 33.41218084283697 + 165.68591909151286 + + + LAW + LAW_1458@GraphGeneration.gov + LAW_1458 + 8 + 4 + 32.51451662034408 + 156.64649366500686 + + + LAW + LAW_1460@GraphGeneration.gov + LAW_1460 + 7 + 4 + 24.421171821628235 + 156.48555946207054 + + + LAW + LAW_1461@GraphGeneration.gov + LAW_1461 + 6 + 4 + 61.15178504451394 + 161.45254588915174 + + + LAW + LAW_1464@GraphGeneration.gov + LAW_1464 + 11 + 4 + 47.44086213540436 + 166.02248791571267 + + + LAW + LAW_1466@GraphGeneration.gov + LAW_1466 + 11 + 4 + 65.25394984188102 + 167.36114332530713 + + + LAW + LAW_1536@GraphGeneration.gov + LAW_1536 + 11 + 4 + 90.26714847099595 + 163.2094379193536 + + + LAW + LAW_1537@GraphGeneration.gov + LAW_1537 + 7 + 4 + 68.95446614326374 + 159.21274073403652 + + + LAW + LAW_1541@GraphGeneration.gov + LAW_1541 + 11 + 4 + 82.52069106332308 + 168.8625519073996 + + + LAW + LAW_1557@GraphGeneration.gov + LAW_1557 + 9 + 4 + 88.9846319947169 + 163.00658712156942 + + + LAW + LAW_1559@GraphGeneration.gov + LAW_1559 + 7 + 4 + 92.12356005733011 + 147.73160926078802 + + + LAW + LAW_1627@GraphGeneration.gov + LAW_1627 + 9 + 4 + 138.50866569423496 + 151.35792994171914 + + + LAW + LAW_1632@GraphGeneration.gov + LAW_1632 + 8 + 4 + 185.63434185058733 + 162.77064593057707 + + + LAW + LAW_1635@GraphGeneration.gov + LAW_1635 + 11 + 4 + 145.36535719792403 + 144.8953545539802 + + + LAW + LAW_1638@GraphGeneration.gov + LAW_1638 + 9 + 4 + 196.63285658561114 + 165.83845287481546 + + + LAW + LAW_1643@GraphGeneration.gov + LAW_1643 + 10 + 4 + 185.8461409239581 + 157.58905207658464 + + + LAW + LAW_1645@GraphGeneration.gov + LAW_1645 + 12 + 4 + 183.07086261596976 + 166.75734786935107 + + + LAW + LAW_1646@GraphGeneration.gov + LAW_1646 + 6 + 4 + 181.39075150651354 + 170.16696340587677 + + + LAW + LAW_1651@GraphGeneration.gov + LAW_1651 + 12 + 4 + 167.9663661637464 + 150.86348737530773 + + + LAW + LAW_1652@GraphGeneration.gov + LAW_1652 + 7 + 4 + 153.86082750120764 + 169.32381206199474 + + + LAW + LAW_1654@GraphGeneration.gov + LAW_1654 + 11 + 4 + 198.88084152375723 + 149.64361873417076 + + + LAW + LAW_1721@GraphGeneration.gov + LAW_1721 + 9 + 4 + 43.239542033992294 + 188.29822043464122 + + + LAW + LAW_1722@GraphGeneration.gov + LAW_1722 + 6 + 4 + 22.578916463603196 + 180.11048397593436 + + + LAW + LAW_1723@GraphGeneration.gov + LAW_1723 + 9 + 4 + 2.847101195204986 + 173.14711399522432 + + + LAW + LAW_1730@GraphGeneration.gov + LAW_1730 + 9 + 4 + 1.7225553582797797 + 199.89110618272522 + + + LAW + LAW_1738@GraphGeneration.gov + LAW_1738 + 7 + 4 + 34.582477398813346 + 184.79331202893715 + + + LAW + LAW_1739@GraphGeneration.gov + LAW_1739 + 11 + 4 + 2.0106683871331743 + 180.13887880381174 + + + LAW + LAW_1745@GraphGeneration.gov + LAW_1745 + 11 + 4 + 32.44239311890069 + 191.64375210817255 + + + LAW + LAW_1746@GraphGeneration.gov + LAW_1746 + 10 + 4 + 66.40848326889828 + 195.25419018036962 + + + LAW + LAW_1809@GraphGeneration.gov + LAW_1809 + 6 + 4 + 104.93818453172513 + 189.5945772062259 + + + LAW + LAW_1813@GraphGeneration.gov + LAW_1813 + 7 + 4 + 99.75653856997056 + 198.4667193924899 + + + LAW + LAW_1819@GraphGeneration.gov + LAW_1819 + 8 + 4 + 126.22787356673632 + 191.6663162602999 + + + LAW + LAW_1820@GraphGeneration.gov + LAW_1820 + 11 + 4 + 67.86298231018579 + 193.14453030711297 + + + LAW + LAW_1823@GraphGeneration.gov + LAW_1823 + 8 + 4 + 67.21799369142262 + 196.57198122593263 + + + LAW + LAW_1826@GraphGeneration.gov + LAW_1826 + 8 + 4 + 99.6793927076608 + 176.58890981020147 + + + LAW + LAW_1827@GraphGeneration.gov + LAW_1827 + 10 + 4 + 68.13021165270425 + 178.268488200545 + + + LAW + LAW_1828@GraphGeneration.gov + LAW_1828 + 7 + 4 + 101.51407669743887 + 179.66377398360223 + + + LAW + LAW_1829@GraphGeneration.gov + LAW_1829 + 10 + 4 + 99.55688660157418 + 182.47307130430667 + + + LAW + LAW_1831@GraphGeneration.gov + LAW_1831 + 10 + 4 + 78.03694647880327 + 197.97417764158462 + + + LAW + LAW_1832@GraphGeneration.gov + LAW_1832 + 7 + 4 + 118.49819363795467 + 193.22921887249046 + + + LAW + LAW_1835@GraphGeneration.gov + LAW_1835 + 8 + 4 + 121.98353767329849 + 185.40577207818694 + + + LAW + LAW_1838@GraphGeneration.gov + LAW_1838 + 7 + 4 + 76.47448333763667 + 196.5228578324979 + + + LAW + LAW_1903@GraphGeneration.gov + LAW_1903 + 10 + 4 + 192.78474768547716 + 177.07777188534197 + + + LAW + LAW_1905@GraphGeneration.gov + LAW_1905 + 7 + 4 + 189.47422632623267 + 176.24966644353592 + + + LAW + LAW_1917@GraphGeneration.gov + LAW_1917 + 9 + 4 + 176.8147933601147 + 172.32252860895255 + + + LAW + LAW_1921@GraphGeneration.gov + LAW_1921 + 9 + 4 + 171.9273541019585 + 198.58680431387754 + + + EMS + EMS_4@GraphGeneration.gov + EMS_4 + 8 + 5 + 37.92350037100433 + 23.215327632051313 + + + EMS + EMS_5@GraphGeneration.gov + EMS_5 + 7 + 5 + 55.39546587909761 + 0.13755689889921438 + + + EMS + EMS_8@GraphGeneration.gov + EMS_8 + 12 + 5 + 10.935683137372447 + 25.285999400055573 + + + EMS + EMS_14@GraphGeneration.gov + EMS_14 + 12 + 5 + 29.220319266856112 + 20.300040066495633 + + + EMS + EMS_15@GraphGeneration.gov + EMS_15 + 6 + 5 + 44.71807860892047 + 24.50992265667276 + + + EMS + EMS_19@GraphGeneration.gov + EMS_19 + 7 + 5 + 29.346250001141893 + 20.619808701543334 + + + EMS + EMS_28@GraphGeneration.gov + EMS_28 + 9 + 5 + 7.795179982943383 + 2.8147290015144586 + + + EMS + EMS_29@GraphGeneration.gov + EMS_29 + 6 + 5 + 42.940960265362456 + 3.1988517638879603 + + + EMS + EMS_100@GraphGeneration.gov + EMS_100 + 11 + 5 + 77.91806607422646 + 15.206599426321903 + + + EMS + EMS_102@GraphGeneration.gov + EMS_102 + 11 + 5 + 113.99293301996997 + 8.841218242375925 + + + EMS + EMS_104@GraphGeneration.gov + EMS_104 + 9 + 5 + 117.36635419068955 + 21.815628824494183 + + + EMS + EMS_105@GraphGeneration.gov + EMS_105 + 11 + 5 + 129.6763273046301 + 19.855587848098484 + + + EMS + EMS_108@GraphGeneration.gov + EMS_108 + 7 + 5 + 113.42107240634978 + 23.6356817159565 + + + EMS + EMS_109@GraphGeneration.gov + EMS_109 + 7 + 5 + 131.355485470602 + 4.371265502227534 + + + EMS + EMS_112@GraphGeneration.gov + EMS_112 + 12 + 5 + 89.97119310299558 + 8.556594191367026 + + + EMS + EMS_114@GraphGeneration.gov + EMS_114 + 8 + 5 + 105.0393213943286 + 25.238400106894005 + + + EMS + EMS_185@GraphGeneration.gov + EMS_185 + 9 + 5 + 186.47204194818943 + 9.804143865341898 + + + EMS + EMS_187@GraphGeneration.gov + EMS_187 + 6 + 5 + 173.65397563935835 + 25.886024856660068 + + + EMS + EMS_199@GraphGeneration.gov + EMS_199 + 10 + 5 + 139.670501985242 + 21.859152882112568 + + + EMS + EMS_207@GraphGeneration.gov + EMS_207 + 8 + 5 + 182.84638948831287 + 27.862208126990808 + + + EMS + EMS_212@GraphGeneration.gov + EMS_212 + 11 + 5 + 161.52710366668234 + 2.167688096526074 + + + EMS + EMS_213@GraphGeneration.gov + EMS_213 + 11 + 5 + 175.0577195089974 + 9.010508264508488 + + + EMS + EMS_278@GraphGeneration.gov + EMS_278 + 9 + 5 + 41.80959947548156 + 49.47520092334647 + + + EMS + EMS_280@GraphGeneration.gov + EMS_280 + 8 + 5 + 53.52949173527739 + 50.16371611241077 + + + EMS + EMS_281@GraphGeneration.gov + EMS_281 + 6 + 5 + 43.99908207964909 + 34.28781848622826 + + + EMS + EMS_287@GraphGeneration.gov + EMS_287 + 6 + 5 + 52.153228343521036 + 54.79769657336733 + + + EMS + EMS_291@GraphGeneration.gov + EMS_291 + 6 + 5 + 5.248530291735487 + 39.651058692721676 + + + EMS + EMS_293@GraphGeneration.gov + EMS_293 + 8 + 5 + 2.6953364243951006 + 38.070290654468934 + + + EMS + EMS_303@GraphGeneration.gov + EMS_303 + 7 + 5 + 22.671922761824728 + 47.95549331708334 + + + EMS + EMS_304@GraphGeneration.gov + EMS_304 + 9 + 5 + 16.60388883555865 + 35.95141763579733 + + + EMS + EMS_305@GraphGeneration.gov + EMS_305 + 10 + 5 + 53.99095277907012 + 28.83866525564532 + + + EMS + EMS_370@GraphGeneration.gov + EMS_370 + 6 + 5 + 82.62503763663871 + 41.29192764679415 + + + EMS + EMS_388@GraphGeneration.gov + EMS_388 + 10 + 5 + 106.59299570473951 + 37.56290648644228 + + + EMS + EMS_390@GraphGeneration.gov + EMS_390 + 7 + 5 + 112.86755458627198 + 48.08479476996159 + + + EMS + EMS_391@GraphGeneration.gov + EMS_391 + 9 + 5 + 81.07637599767216 + 28.82156417261308 + + + EMS + EMS_395@GraphGeneration.gov + EMS_395 + 7 + 5 + 123.89517462257658 + 38.63809535934438 + + + EMS + EMS_463@GraphGeneration.gov + EMS_463 + 11 + 5 + 180.98353190589205 + 42.58523216879868 + + + EMS + EMS_467@GraphGeneration.gov + EMS_467 + 9 + 5 + 148.50047234394765 + 48.98176655595241 + + + EMS + EMS_471@GraphGeneration.gov + EMS_471 + 7 + 5 + 139.6597178442132 + 49.952211004084816 + + + EMS + EMS_472@GraphGeneration.gov + EMS_472 + 10 + 5 + 140.99529222020166 + 34.15732354256314 + + + EMS + EMS_473@GraphGeneration.gov + EMS_473 + 9 + 5 + 164.3719605054992 + 42.96304512012843 + + + EMS + EMS_474@GraphGeneration.gov + EMS_474 + 6 + 5 + 159.38863795572107 + 40.54334477444894 + + + EMS + EMS_482@GraphGeneration.gov + EMS_482 + 6 + 5 + 140.69659039236188 + 37.65978873940715 + + + EMS + EMS_574@GraphGeneration.gov + EMS_574 + 11 + 5 + 24.92790442186482 + 69.5358368178317 + + + EMS + EMS_579@GraphGeneration.gov + EMS_579 + 11 + 5 + 13.70960049313351 + 79.83183108379002 + + + EMS + EMS_581@GraphGeneration.gov + EMS_581 + 11 + 5 + 30.13110319694395 + 67.05817468613951 + + + EMS + EMS_582@GraphGeneration.gov + EMS_582 + 7 + 5 + 0.21072603985530977 + 70.10913653630422 + + + EMS + EMS_647@GraphGeneration.gov + EMS_647 + 8 + 5 + 120.54968358028617 + 73.2977585578829 + + + EMS + EMS_661@GraphGeneration.gov + EMS_661 + 7 + 5 + 99.9266045696777 + 58.75541634138498 + + + EMS + EMS_665@GraphGeneration.gov + EMS_665 + 11 + 5 + 122.73430854667698 + 59.18219206603793 + + + EMS + EMS_669@GraphGeneration.gov + EMS_669 + 11 + 5 + 115.36235077031976 + 74.49647747272566 + + + EMS + EMS_670@GraphGeneration.gov + EMS_670 + 12 + 5 + 70.82207369086258 + 78.84657562735998 + + + EMS + EMS_671@GraphGeneration.gov + EMS_671 + 7 + 5 + 104.18739070427655 + 82.48499205692103 + + + EMS + EMS_673@GraphGeneration.gov + EMS_673 + 12 + 5 + 88.88059150372801 + 73.53327316539298 + + + EMS + EMS_674@GraphGeneration.gov + EMS_674 + 8 + 5 + 123.24274566630808 + 84.1821610113357 + + + EMS + EMS_737@GraphGeneration.gov + EMS_737 + 12 + 5 + 164.56457981617544 + 76.02905625991059 + + + EMS + EMS_738@GraphGeneration.gov + EMS_738 + 7 + 5 + 188.0436605158725 + 77.46963451929275 + + + EMS + EMS_739@GraphGeneration.gov + EMS_739 + 10 + 5 + 139.07661208313897 + 71.29937391905746 + + + EMS + EMS_742@GraphGeneration.gov + EMS_742 + 11 + 5 + 156.17243154392335 + 73.56827094854002 + + + EMS + EMS_748@GraphGeneration.gov + EMS_748 + 9 + 5 + 177.31554660839936 + 61.649136703889646 + + + EMS + EMS_752@GraphGeneration.gov + EMS_752 + 12 + 5 + 184.080481453756 + 67.11217806068811 + + + EMS + EMS_755@GraphGeneration.gov + EMS_755 + 8 + 5 + 145.59150923247367 + 62.44187071844398 + + + EMS + EMS_758@GraphGeneration.gov + EMS_758 + 9 + 5 + 177.0485021651409 + 71.72794606032728 + + + EMS + EMS_759@GraphGeneration.gov + EMS_759 + 11 + 5 + 195.32709588226393 + 72.97022173423647 + + + EMS + EMS_761@GraphGeneration.gov + EMS_761 + 10 + 5 + 151.72986918029727 + 60.81318170135079 + + + EMS + EMS_762@GraphGeneration.gov + EMS_762 + 9 + 5 + 193.31822429918603 + 74.42459144706024 + + + EMS + EMS_831@GraphGeneration.gov + EMS_831 + 6 + 5 + 9.008834684681855 + 89.25812219914442 + + + EMS + EMS_832@GraphGeneration.gov + EMS_832 + 8 + 5 + 25.734341359908555 + 113.14339598547406 + + + EMS + EMS_833@GraphGeneration.gov + EMS_833 + 11 + 5 + 14.775122828347433 + 107.59495611074365 + + + EMS + EMS_836@GraphGeneration.gov + EMS_836 + 6 + 5 + 29.02671162874377 + 100.16848916015051 + + + EMS + EMS_846@GraphGeneration.gov + EMS_846 + 6 + 5 + 8.452854334345025 + 87.90570886599836 + + + EMS + EMS_849@GraphGeneration.gov + EMS_849 + 6 + 5 + 49.26086385324426 + 112.53195714350703 + + + EMS + EMS_851@GraphGeneration.gov + EMS_851 + 8 + 5 + 2.5825739922494892 + 92.17291674792224 + + + EMS + EMS_857@GraphGeneration.gov + EMS_857 + 6 + 5 + 62.43630161117243 + 104.21396438050186 + + + EMS + EMS_922@GraphGeneration.gov + EMS_922 + 7 + 5 + 73.60118479852899 + 106.52432302864885 + + + EMS + EMS_923@GraphGeneration.gov + EMS_923 + 8 + 5 + 112.05337828780682 + 110.05600709665363 + + + EMS + EMS_927@GraphGeneration.gov + EMS_927 + 7 + 5 + 77.31056975764335 + 110.36078632857064 + + + EMS + EMS_931@GraphGeneration.gov + EMS_931 + 12 + 5 + 94.47296453953226 + 112.34597518840175 + + + EMS + EMS_936@GraphGeneration.gov + EMS_936 + 6 + 5 + 101.1648471021498 + 107.34985603163234 + + + EMS + EMS_937@GraphGeneration.gov + EMS_937 + 8 + 5 + 87.46423704841007 + 100.52057927959368 + + + EMS + EMS_948@GraphGeneration.gov + EMS_948 + 10 + 5 + 122.39846098012359 + 109.09354216005386 + + + EMS + EMS_949@GraphGeneration.gov + EMS_949 + 7 + 5 + 122.84032093671425 + 101.22814290083184 + + + EMS + EMS_950@GraphGeneration.gov + EMS_950 + 7 + 5 + 105.18250299976805 + 96.28625751781733 + + + EMS + EMS_1020@GraphGeneration.gov + EMS_1020 + 7 + 5 + 141.8711457997561 + 97.96604591323246 + + + EMS + EMS_1021@GraphGeneration.gov + EMS_1021 + 9 + 5 + 141.9314729046701 + 86.37273400083532 + + + EMS + EMS_1024@GraphGeneration.gov + EMS_1024 + 6 + 5 + 155.62579382309968 + 95.06056918445223 + + + EMS + EMS_1025@GraphGeneration.gov + EMS_1025 + 12 + 5 + 139.33928255226374 + 104.10611531236695 + + + EMS + EMS_1026@GraphGeneration.gov + EMS_1026 + 8 + 5 + 185.69627010417463 + 109.52827573781065 + + + EMS + EMS_1029@GraphGeneration.gov + EMS_1029 + 7 + 5 + 163.67623382663268 + 90.8378097360167 + + + EMS + EMS_1031@GraphGeneration.gov + EMS_1031 + 12 + 5 + 139.01696963939298 + 106.46127788154055 + + + EMS + EMS_1033@GraphGeneration.gov + EMS_1033 + 6 + 5 + 144.6560934860995 + 95.35004446123483 + + + EMS + EMS_1035@GraphGeneration.gov + EMS_1035 + 7 + 5 + 175.5566005265133 + 95.43507503709664 + + + EMS + EMS_1106@GraphGeneration.gov + EMS_1106 + 8 + 5 + 55.149659110590186 + 129.79881378474514 + + + EMS + EMS_1112@GraphGeneration.gov + EMS_1112 + 9 + 5 + 49.69409333552046 + 122.16165182880025 + + + EMS + EMS_1117@GraphGeneration.gov + EMS_1117 + 12 + 5 + 22.404477618166396 + 115.12315563539765 + + + EMS + EMS_1118@GraphGeneration.gov + EMS_1118 + 11 + 5 + 18.261742579163318 + 122.70594529608258 + + + EMS + EMS_1121@GraphGeneration.gov + EMS_1121 + 8 + 5 + 60.308372209720986 + 120.29077051827282 + + + EMS + EMS_1130@GraphGeneration.gov + EMS_1130 + 10 + 5 + 64.17245375321698 + 123.76938275930841 + + + EMS + EMS_1201@GraphGeneration.gov + EMS_1201 + 10 + 5 + 100.80577820865133 + 138.22036235969318 + + + EMS + EMS_1203@GraphGeneration.gov + EMS_1203 + 6 + 5 + 104.2250850802289 + 114.50512435720091 + + + EMS + EMS_1206@GraphGeneration.gov + EMS_1206 + 9 + 5 + 128.1883058161159 + 139.13403372853955 + + + EMS + EMS_1208@GraphGeneration.gov + EMS_1208 + 6 + 5 + 131.28640458638648 + 131.08246079167304 + + + EMS + EMS_1210@GraphGeneration.gov + EMS_1210 + 11 + 5 + 115.21327153945677 + 124.9392605041629 + + + EMS + EMS_1211@GraphGeneration.gov + EMS_1211 + 8 + 5 + 113.9188598526004 + 122.8609836522822 + + + EMS + EMS_1223@GraphGeneration.gov + EMS_1223 + 6 + 5 + 67.71136826877489 + 128.75438453014178 + + + EMS + EMS_1225@GraphGeneration.gov + EMS_1225 + 8 + 5 + 112.31202008585103 + 118.9667502066422 + + + EMS + EMS_1226@GraphGeneration.gov + EMS_1226 + 12 + 5 + 85.5808450341149 + 115.29973779241782 + + + EMS + EMS_1290@GraphGeneration.gov + EMS_1290 + 6 + 5 + 195.10919516052533 + 135.06067412229123 + + + EMS + EMS_1296@GraphGeneration.gov + EMS_1296 + 6 + 5 + 147.48397378138708 + 131.13598986559742 + + + EMS + EMS_1297@GraphGeneration.gov + EMS_1297 + 7 + 5 + 190.1531940014856 + 139.94982748136528 + + + EMS + EMS_1307@GraphGeneration.gov + EMS_1307 + 9 + 5 + 170.02309967058696 + 118.21151286160918 + + + EMS + EMS_1310@GraphGeneration.gov + EMS_1310 + 10 + 5 + 147.02553001707892 + 132.59339252576794 + + + EMS + EMS_1314@GraphGeneration.gov + EMS_1314 + 10 + 5 + 139.253407869409 + 125.7547120918265 + + + EMS + EMS_1316@GraphGeneration.gov + EMS_1316 + 8 + 5 + 146.80408114488168 + 135.1176651566524 + + + EMS + EMS_1385@GraphGeneration.gov + EMS_1385 + 11 + 5 + 7.3604101125202 + 171.2520418801709 + + + EMS + EMS_1392@GraphGeneration.gov + EMS_1392 + 10 + 5 + 30.549160937719535 + 171.3807023424848 + + + EMS + EMS_1393@GraphGeneration.gov + EMS_1393 + 11 + 5 + 29.07981782268893 + 150.14208443567526 + + + EMS + EMS_1398@GraphGeneration.gov + EMS_1398 + 7 + 5 + 9.702929936205326 + 144.29337990025206 + + + EMS + EMS_1403@GraphGeneration.gov + EMS_1403 + 12 + 5 + 18.57142834181729 + 163.13103116924708 + + + EMS + EMS_1405@GraphGeneration.gov + EMS_1405 + 10 + 5 + 38.2339995069527 + 149.01957234926215 + + + EMS + EMS_1409@GraphGeneration.gov + EMS_1409 + 7 + 5 + 17.868399185237802 + 162.6501336718323 + + + EMS + EMS_1478@GraphGeneration.gov + EMS_1478 + 9 + 5 + 112.99906987845857 + 159.320033069597 + + + EMS + EMS_1479@GraphGeneration.gov + EMS_1479 + 7 + 5 + 129.59636388782891 + 149.14610725253078 + + + EMS + EMS_1484@GraphGeneration.gov + EMS_1484 + 6 + 5 + 89.80274893833376 + 171.1960376332653 + + + EMS + EMS_1487@GraphGeneration.gov + EMS_1487 + 6 + 5 + 90.14501358048267 + 161.12495098805672 + + + EMS + EMS_1496@GraphGeneration.gov + EMS_1496 + 11 + 5 + 109.36138247013544 + 161.35641920025253 + + + EMS + EMS_1499@GraphGeneration.gov + EMS_1499 + 6 + 5 + 112.61174073372129 + 166.21569439329645 + + + EMS + EMS_1500@GraphGeneration.gov + EMS_1500 + 11 + 5 + 95.31749808631184 + 145.87263939275238 + + + EMS + EMS_1501@GraphGeneration.gov + EMS_1501 + 8 + 5 + 97.35475298705869 + 154.3444438230534 + + + EMS + EMS_1568@GraphGeneration.gov + EMS_1568 + 9 + 5 + 191.857070323042 + 156.69039455057342 + + + EMS + EMS_1569@GraphGeneration.gov + EMS_1569 + 10 + 5 + 137.09010843196356 + 164.03094033717423 + + + EMS + EMS_1576@GraphGeneration.gov + EMS_1576 + 10 + 5 + 177.84987698957394 + 154.32104882915124 + + + EMS + EMS_1578@GraphGeneration.gov + EMS_1578 + 9 + 5 + 152.7935473812322 + 150.87210814409383 + + + EMS + EMS_1580@GraphGeneration.gov + EMS_1580 + 12 + 5 + 144.5600462978506 + 143.22191475472835 + + + EMS + EMS_1582@GraphGeneration.gov + EMS_1582 + 8 + 5 + 177.39570521287655 + 153.49638798022255 + + + EMS + EMS_1589@GraphGeneration.gov + EMS_1589 + 12 + 5 + 192.78757196777008 + 152.4783329309889 + + + EMS + EMS_1591@GraphGeneration.gov + EMS_1591 + 10 + 5 + 187.45283830205162 + 148.4509280418774 + + + EMS + EMS_1592@GraphGeneration.gov + EMS_1592 + 12 + 5 + 175.43011079482557 + 162.24697169046442 + + + EMS + EMS_1593@GraphGeneration.gov + EMS_1593 + 11 + 5 + 137.67097195608306 + 151.01064104243625 + + + EMS + EMS_1662@GraphGeneration.gov + EMS_1662 + 10 + 5 + 53.460666372554876 + 184.09941894626547 + + + EMS + EMS_1663@GraphGeneration.gov + EMS_1663 + 10 + 5 + 35.35459181743054 + 182.3449303452015 + + + EMS + EMS_1664@GraphGeneration.gov + EMS_1664 + 9 + 5 + 41.58348463089494 + 180.9650092902167 + + + EMS + EMS_1674@GraphGeneration.gov + EMS_1674 + 9 + 5 + 27.07746939166846 + 183.92859558468749 + + + EMS + EMS_1677@GraphGeneration.gov + EMS_1677 + 10 + 5 + 64.0183090242734 + 176.3914393512334 + + + EMS + EMS_1678@GraphGeneration.gov + EMS_1678 + 8 + 5 + 65.79797633900507 + 190.58731881300088 + + + EMS + EMS_1686@GraphGeneration.gov + EMS_1686 + 10 + 5 + 16.464304364255003 + 191.35718683132905 + + + EMS + EMS_1750@GraphGeneration.gov + EMS_1750 + 6 + 5 + 127.28449077828245 + 189.0030589305404 + + + EMS + EMS_1751@GraphGeneration.gov + EMS_1751 + 6 + 5 + 118.41791319284309 + 197.8092678060444 + + + EMS + EMS_1757@GraphGeneration.gov + EMS_1757 + 11 + 5 + 70.65311918135356 + 181.60930036689186 + + + EMS + EMS_1759@GraphGeneration.gov + EMS_1759 + 10 + 5 + 81.0956547452732 + 178.19098529403198 + + + EMS + EMS_1761@GraphGeneration.gov + EMS_1761 + 9 + 5 + 94.70312630934731 + 182.8331257442632 + + + EMS + EMS_1765@GraphGeneration.gov + EMS_1765 + 8 + 5 + 98.01869858055522 + 181.28886768961797 + + + EMS + EMS_1775@GraphGeneration.gov + EMS_1775 + 9 + 5 + 89.16251637902297 + 175.2152620153196 + + + EMS + EMS_1778@GraphGeneration.gov + EMS_1778 + 10 + 5 + 114.61791930306877 + 194.1765873247449 + + + EMS + EMS_1842@GraphGeneration.gov + EMS_1842 + 9 + 5 + 164.53743023446444 + 176.9071934721059 + + + EMS + EMS_1847@GraphGeneration.gov + EMS_1847 + 8 + 5 + 183.55357962983857 + 198.61850933894294 + + + EMS + EMS_1849@GraphGeneration.gov + EMS_1849 + 9 + 5 + 143.84634939528283 + 172.12316748957522 + + + EMS + EMS_1850@GraphGeneration.gov + EMS_1850 + 8 + 5 + 133.9931037034244 + 178.06484875046155 + + + EMS + EMS_1852@GraphGeneration.gov + EMS_1852 + 7 + 5 + 142.91243309927654 + 184.9446419081314 + + + EMS + EMS_1854@GraphGeneration.gov + EMS_1854 + 7 + 5 + 194.10385117630284 + 176.53458748612408 + + + EMS + EMS_1859@GraphGeneration.gov + EMS_1859 + 8 + 5 + 134.5095002371284 + 171.486057357573 + + + EMS + EMS_1860@GraphGeneration.gov + EMS_1860 + 6 + 5 + 162.36987946559526 + 175.22726907216028 + + + FIRE + FIRE_39@GraphGeneration.gov + FIRE_39 + 7 + 5 + 52.44609539746654 + 3.8402885976844097 + + + FIRE + FIRE_44@GraphGeneration.gov + FIRE_44 + 10 + 5 + 54.38693355844612 + 26.95514122812552 + + + FIRE + FIRE_47@GraphGeneration.gov + FIRE_47 + 7 + 5 + 59.841777783140735 + 23.984736637699463 + + + FIRE + FIRE_52@GraphGeneration.gov + FIRE_52 + 8 + 5 + 26.534525698434585 + 1.741038668468715 + + + FIRE + FIRE_59@GraphGeneration.gov + FIRE_59 + 9 + 5 + 21.407542847202166 + 14.002799275349735 + + + FIRE + FIRE_124@GraphGeneration.gov + FIRE_124 + 12 + 5 + 78.9062618887843 + 20.528897044909666 + + + FIRE + FIRE_127@GraphGeneration.gov + FIRE_127 + 6 + 5 + 73.15480553764512 + 17.740480811962797 + + + FIRE + FIRE_136@GraphGeneration.gov + FIRE_136 + 10 + 5 + 88.7727929419646 + 20.78974219919326 + + + FIRE + FIRE_137@GraphGeneration.gov + FIRE_137 + 9 + 5 + 87.68081882591551 + 16.991539836545932 + + + FIRE + FIRE_141@GraphGeneration.gov + FIRE_141 + 10 + 5 + 87.35431023310679 + 15.222099300250765 + + + FIRE + FIRE_144@GraphGeneration.gov + FIRE_144 + 9 + 5 + 114.9829880204943 + 2.788789331402741 + + + FIRE + FIRE_145@GraphGeneration.gov + FIRE_145 + 7 + 5 + 83.95066256302752 + 9.228464686421534 + + + FIRE + FIRE_149@GraphGeneration.gov + FIRE_149 + 11 + 5 + 74.78103595993863 + 14.279049191803509 + + + FIRE + FIRE_215@GraphGeneration.gov + FIRE_215 + 8 + 5 + 151.49953928764697 + 14.059389209328115 + + + FIRE + FIRE_217@GraphGeneration.gov + FIRE_217 + 11 + 5 + 169.30076425056996 + 9.331427058992011 + + + FIRE + FIRE_219@GraphGeneration.gov + FIRE_219 + 12 + 5 + 140.7306799535243 + 16.606458452330866 + + + FIRE + FIRE_222@GraphGeneration.gov + FIRE_222 + 11 + 5 + 182.63727896605866 + 28.48123622952132 + + + FIRE + FIRE_231@GraphGeneration.gov + FIRE_231 + 7 + 5 + 154.8410819715237 + 14.042783550478973 + + + FIRE + FIRE_234@GraphGeneration.gov + FIRE_234 + 11 + 5 + 198.49187496273527 + 5.536825239326853 + + + FIRE + FIRE_240@GraphGeneration.gov + FIRE_240 + 12 + 5 + 167.43181939902183 + 22.089941210500328 + + + FIRE + FIRE_311@GraphGeneration.gov + FIRE_311 + 7 + 5 + 45.10310229717604 + 40.28771972364731 + + + FIRE + FIRE_318@GraphGeneration.gov + FIRE_318 + 7 + 5 + 20.77074090099468 + 36.4337241968922 + + + FIRE + FIRE_324@GraphGeneration.gov + FIRE_324 + 11 + 5 + 15.067561146191952 + 38.62073132120864 + + + FIRE + FIRE_326@GraphGeneration.gov + FIRE_326 + 11 + 5 + 48.973401607652974 + 44.208769732784134 + + + FIRE + FIRE_335@GraphGeneration.gov + FIRE_335 + 6 + 5 + 9.835928459179067 + 36.668831262390455 + + + FIRE + FIRE_336@GraphGeneration.gov + FIRE_336 + 6 + 5 + 40.28917940211862 + 35.71200051894308 + + + FIRE + FIRE_408@GraphGeneration.gov + FIRE_408 + 12 + 5 + 79.32147840290176 + 50.12050267904334 + + + FIRE + FIRE_410@GraphGeneration.gov + FIRE_410 + 10 + 5 + 82.21072750862756 + 31.677322481768577 + + + FIRE + FIRE_414@GraphGeneration.gov + FIRE_414 + 6 + 5 + 101.99938240289006 + 46.496944552922656 + + + FIRE + FIRE_423@GraphGeneration.gov + FIRE_423 + 10 + 5 + 81.61868901818369 + 39.991164689900785 + + + FIRE + FIRE_424@GraphGeneration.gov + FIRE_424 + 7 + 5 + 120.55916044899881 + 55.53151464176432 + + + FIRE + FIRE_492@GraphGeneration.gov + FIRE_492 + 9 + 5 + 183.41416707130645 + 56.43689275840002 + + + FIRE + FIRE_497@GraphGeneration.gov + FIRE_497 + 12 + 5 + 142.51341481871475 + 37.011028137562135 + + + FIRE + FIRE_501@GraphGeneration.gov + FIRE_501 + 10 + 5 + 145.90081206295878 + 53.53890048981603 + + + FIRE + FIRE_504@GraphGeneration.gov + FIRE_504 + 7 + 5 + 174.65362181680263 + 36.74632663696582 + + + FIRE + FIRE_505@GraphGeneration.gov + FIRE_505 + 9 + 5 + 163.80639763009668 + 52.21035682507149 + + + FIRE + FIRE_513@GraphGeneration.gov + FIRE_513 + 12 + 5 + 187.15271780434614 + 39.88983609896651 + + + FIRE + FIRE_519@GraphGeneration.gov + FIRE_519 + 12 + 5 + 141.95787914713017 + 43.614930082472505 + + + FIRE + FIRE_589@GraphGeneration.gov + FIRE_589 + 12 + 5 + 16.83957785978144 + 75.76995177929261 + + + FIRE + FIRE_590@GraphGeneration.gov + FIRE_590 + 9 + 5 + 66.03013833391796 + 62.14640845623531 + + + FIRE + FIRE_601@GraphGeneration.gov + FIRE_601 + 12 + 5 + 34.7112697538396 + 60.17155638214466 + + + FIRE + FIRE_612@GraphGeneration.gov + FIRE_612 + 6 + 5 + 12.004117616037185 + 71.75851404516972 + + + FIRE + FIRE_677@GraphGeneration.gov + FIRE_677 + 12 + 5 + 78.51433724959648 + 70.25214720708729 + + + FIRE + FIRE_680@GraphGeneration.gov + FIRE_680 + 7 + 5 + 82.61424612727164 + 58.01382226077925 + + + FIRE + FIRE_688@GraphGeneration.gov + FIRE_688 + 10 + 5 + 124.32879886944639 + 60.47477814420351 + + + FIRE + FIRE_689@GraphGeneration.gov + FIRE_689 + 9 + 5 + 85.3197998078081 + 78.35146487412982 + + + FIRE + FIRE_698@GraphGeneration.gov + FIRE_698 + 10 + 5 + 74.91909914268984 + 85.58103591377112 + + + FIRE + FIRE_701@GraphGeneration.gov + FIRE_701 + 7 + 5 + 75.29138633984432 + 57.55773650923262 + + + FIRE + FIRE_704@GraphGeneration.gov + FIRE_704 + 7 + 5 + 105.04942189874025 + 78.76228159366612 + + + FIRE + FIRE_767@GraphGeneration.gov + FIRE_767 + 7 + 5 + 156.7462170169933 + 59.737484376440605 + + + FIRE + FIRE_773@GraphGeneration.gov + FIRE_773 + 7 + 5 + 174.24696351351554 + 60.38381956436396 + + + FIRE + FIRE_774@GraphGeneration.gov + FIRE_774 + 8 + 5 + 144.51219593561922 + 68.3709664245582 + + + FIRE + FIRE_775@GraphGeneration.gov + FIRE_775 + 12 + 5 + 139.98752753907823 + 85.2688498342445 + + + FIRE + FIRE_778@GraphGeneration.gov + FIRE_778 + 12 + 5 + 136.55564924650778 + 78.51654510166958 + + + FIRE + FIRE_781@GraphGeneration.gov + FIRE_781 + 6 + 5 + 137.75780188236885 + 58.53998075186977 + + + FIRE + FIRE_784@GraphGeneration.gov + FIRE_784 + 10 + 5 + 162.43260824206692 + 84.64270860599773 + + + FIRE + FIRE_787@GraphGeneration.gov + FIRE_787 + 8 + 5 + 190.87030944009055 + 77.03448218186972 + + + FIRE + FIRE_788@GraphGeneration.gov + FIRE_788 + 6 + 5 + 152.38068207115893 + 70.28561582442613 + + + FIRE + FIRE_791@GraphGeneration.gov + FIRE_791 + 9 + 5 + 190.52540144218761 + 81.90880301856058 + + + FIRE + FIRE_794@GraphGeneration.gov + FIRE_794 + 10 + 5 + 161.28078650124894 + 59.252211001290476 + + + FIRE + FIRE_863@GraphGeneration.gov + FIRE_863 + 11 + 5 + 65.78687996617722 + 86.2227708507688 + + + FIRE + FIRE_869@GraphGeneration.gov + FIRE_869 + 11 + 5 + 57.1411382708069 + 105.62108660929553 + + + FIRE + FIRE_870@GraphGeneration.gov + FIRE_870 + 6 + 5 + 46.2999757844602 + 89.61465525786073 + + + FIRE + FIRE_871@GraphGeneration.gov + FIRE_871 + 6 + 5 + 35.87375489074635 + 113.94954119089181 + + + FIRE + FIRE_873@GraphGeneration.gov + FIRE_873 + 8 + 5 + 53.81800341461849 + 91.9304629213545 + + + FIRE + FIRE_876@GraphGeneration.gov + FIRE_876 + 11 + 5 + 13.391362840599683 + 92.89600028105048 + + + FIRE + FIRE_878@GraphGeneration.gov + FIRE_878 + 8 + 5 + 25.76095921418859 + 110.60510848051774 + + + FIRE + FIRE_879@GraphGeneration.gov + FIRE_879 + 9 + 5 + 34.03134104183512 + 97.33533153622011 + + + FIRE + FIRE_885@GraphGeneration.gov + FIRE_885 + 12 + 5 + 62.42882552655992 + 96.96187457142386 + + + FIRE + FIRE_955@GraphGeneration.gov + FIRE_955 + 12 + 5 + 115.54526074524415 + 88.03363820553139 + + + FIRE + FIRE_959@GraphGeneration.gov + FIRE_959 + 10 + 5 + 125.16437377355473 + 96.00953594809512 + + + FIRE + FIRE_965@GraphGeneration.gov + FIRE_965 + 11 + 5 + 80.5685162761188 + 108.24150385678215 + + + FIRE + FIRE_967@GraphGeneration.gov + FIRE_967 + 9 + 5 + 97.3069973584539 + 104.09034939430596 + + + FIRE + FIRE_972@GraphGeneration.gov + FIRE_972 + 7 + 5 + 90.4142665014241 + 96.06637483771739 + + + FIRE + FIRE_976@GraphGeneration.gov + FIRE_976 + 7 + 5 + 104.4593086843035 + 87.20066465896794 + + + FIRE + FIRE_977@GraphGeneration.gov + FIRE_977 + 12 + 5 + 126.92295699694525 + 87.79075207115523 + + + FIRE + FIRE_978@GraphGeneration.gov + FIRE_978 + 8 + 5 + 117.83915094255542 + 101.6966851110717 + + + FIRE + FIRE_1044@GraphGeneration.gov + FIRE_1044 + 9 + 5 + 181.65108617781482 + 108.91730541251127 + + + FIRE + FIRE_1049@GraphGeneration.gov + FIRE_1049 + 7 + 5 + 155.75976251170223 + 112.15669128241004 + + + FIRE + FIRE_1050@GraphGeneration.gov + FIRE_1050 + 9 + 5 + 151.93076482687573 + 90.84785763020146 + + + FIRE + FIRE_1055@GraphGeneration.gov + FIRE_1055 + 9 + 5 + 157.22493866930495 + 100.73772982008862 + + + FIRE + FIRE_1061@GraphGeneration.gov + FIRE_1061 + 6 + 5 + 162.55841845385856 + 90.43332795214944 + + + FIRE + FIRE_1062@GraphGeneration.gov + FIRE_1062 + 7 + 5 + 155.53113747413616 + 99.12882428124081 + + + FIRE + FIRE_1063@GraphGeneration.gov + FIRE_1063 + 11 + 5 + 147.1430403912329 + 102.56806336613867 + + + FIRE + FIRE_1067@GraphGeneration.gov + FIRE_1067 + 9 + 5 + 142.90501291985385 + 99.82642677252207 + + + FIRE + FIRE_1068@GraphGeneration.gov + FIRE_1068 + 6 + 5 + 172.51728041834932 + 105.02055280027221 + + + FIRE + FIRE_1140@GraphGeneration.gov + FIRE_1140 + 6 + 5 + 1.349944331582583 + 116.92359501783955 + + + FIRE + FIRE_1143@GraphGeneration.gov + FIRE_1143 + 6 + 5 + 48.99790749360029 + 131.13815524958338 + + + FIRE + FIRE_1149@GraphGeneration.gov + FIRE_1149 + 9 + 5 + 59.423747469545354 + 128.53396618193452 + + + FIRE + FIRE_1159@GraphGeneration.gov + FIRE_1159 + 12 + 5 + 29.760449011248188 + 125.24661606922365 + + + FIRE + FIRE_1162@GraphGeneration.gov + FIRE_1162 + 10 + 5 + 13.10751340999544 + 116.9966167259206 + + + FIRE + FIRE_1227@GraphGeneration.gov + FIRE_1227 + 8 + 5 + 129.2811224622846 + 132.16874103224472 + + + FIRE + FIRE_1233@GraphGeneration.gov + FIRE_1233 + 8 + 5 + 73.89746770234291 + 133.79029250325362 + + + FIRE + FIRE_1235@GraphGeneration.gov + FIRE_1235 + 12 + 5 + 110.2280002047325 + 137.77833011029043 + + + FIRE + FIRE_1242@GraphGeneration.gov + FIRE_1242 + 10 + 5 + 76.21423977529452 + 131.03444074976736 + + + FIRE + FIRE_1249@GraphGeneration.gov + FIRE_1249 + 8 + 5 + 100.82205030332489 + 133.09459147090146 + + + FIRE + FIRE_1253@GraphGeneration.gov + FIRE_1253 + 12 + 5 + 90.27770142352307 + 124.70760159063163 + + + FIRE + FIRE_1254@GraphGeneration.gov + FIRE_1254 + 7 + 5 + 115.4921447582878 + 127.33820600577701 + + + FIRE + FIRE_1320@GraphGeneration.gov + FIRE_1320 + 7 + 5 + 138.4869203092473 + 121.6990114837863 + + + FIRE + FIRE_1323@GraphGeneration.gov + FIRE_1323 + 10 + 5 + 198.90542047255195 + 134.70465862415077 + + + FIRE + FIRE_1325@GraphGeneration.gov + FIRE_1325 + 11 + 5 + 172.30190400418007 + 142.23400719032713 + + + FIRE + FIRE_1327@GraphGeneration.gov + FIRE_1327 + 8 + 5 + 161.47706153889348 + 124.81480953044816 + + + FIRE + FIRE_1329@GraphGeneration.gov + FIRE_1329 + 7 + 5 + 133.40981651984083 + 136.31559880013438 + + + FIRE + FIRE_1331@GraphGeneration.gov + FIRE_1331 + 7 + 5 + 152.86001668888792 + 139.1685808762509 + + + FIRE + FIRE_1336@GraphGeneration.gov + FIRE_1336 + 6 + 5 + 148.22370974957158 + 125.97512252872119 + + + FIRE + FIRE_1337@GraphGeneration.gov + FIRE_1337 + 8 + 5 + 146.2451307846912 + 133.95259289669818 + + + FIRE + FIRE_1340@GraphGeneration.gov + FIRE_1340 + 7 + 5 + 156.01999133909118 + 131.5806169265919 + + + FIRE + FIRE_1342@GraphGeneration.gov + FIRE_1342 + 10 + 5 + 191.60463292750745 + 128.5143883325632 + + + FIRE + FIRE_1412@GraphGeneration.gov + FIRE_1412 + 11 + 5 + 28.1657067480592 + 162.91624361124522 + + + FIRE + FIRE_1418@GraphGeneration.gov + FIRE_1418 + 12 + 5 + 56.20494126124436 + 167.27258057800222 + + + FIRE + FIRE_1429@GraphGeneration.gov + FIRE_1429 + 12 + 5 + 60.86490858973752 + 150.84797050804298 + + + FIRE + FIRE_1431@GraphGeneration.gov + FIRE_1431 + 7 + 5 + 30.455034656433156 + 156.2201138188204 + + + FIRE + FIRE_1433@GraphGeneration.gov + FIRE_1433 + 11 + 5 + 14.017981219949698 + 160.0867011204229 + + + FIRE + FIRE_1435@GraphGeneration.gov + FIRE_1435 + 12 + 5 + 43.206310032728055 + 147.30214052831022 + + + FIRE + FIRE_1438@GraphGeneration.gov + FIRE_1438 + 6 + 5 + 9.06435119867016 + 159.57807425372255 + + + FIRE + FIRE_1439@GraphGeneration.gov + FIRE_1439 + 7 + 5 + 54.50712167647027 + 149.25047111508414 + + + FIRE + FIRE_1440@GraphGeneration.gov + FIRE_1440 + 7 + 5 + 11.587560727502867 + 151.84519837509615 + + + FIRE + FIRE_1503@GraphGeneration.gov + FIRE_1503 + 6 + 5 + 104.7475151392427 + 153.6092558643756 + + + FIRE + FIRE_1504@GraphGeneration.gov + FIRE_1504 + 12 + 5 + 95.01418613532155 + 152.30946989615398 + + + FIRE + FIRE_1514@GraphGeneration.gov + FIRE_1514 + 8 + 5 + 119.23461704118088 + 145.27013543479325 + + + FIRE + FIRE_1517@GraphGeneration.gov + FIRE_1517 + 6 + 5 + 103.20931551420622 + 161.5281095792243 + + + FIRE + FIRE_1518@GraphGeneration.gov + FIRE_1518 + 12 + 5 + 113.77824454050194 + 155.66451404817482 + + + FIRE + FIRE_1522@GraphGeneration.gov + FIRE_1522 + 6 + 5 + 83.53648029509195 + 147.00675119161028 + + + FIRE + FIRE_1526@GraphGeneration.gov + FIRE_1526 + 10 + 5 + 93.25372294842106 + 155.55329719779797 + + + FIRE + FIRE_1531@GraphGeneration.gov + FIRE_1531 + 10 + 5 + 87.20789568191384 + 149.26213072526633 + + + FIRE + FIRE_1595@GraphGeneration.gov + FIRE_1595 + 12 + 5 + 146.3166997834195 + 147.12440230172916 + + + FIRE + FIRE_1597@GraphGeneration.gov + FIRE_1597 + 10 + 5 + 138.00008084626438 + 167.4886479372803 + + + FIRE + FIRE_1598@GraphGeneration.gov + FIRE_1598 + 8 + 5 + 137.10535594380502 + 158.57572504197444 + + + FIRE + FIRE_1612@GraphGeneration.gov + FIRE_1612 + 7 + 5 + 197.09729971753416 + 165.72660560646557 + + + FIRE + FIRE_1615@GraphGeneration.gov + FIRE_1615 + 12 + 5 + 194.5512398709355 + 160.07051639260334 + + + FIRE + FIRE_1621@GraphGeneration.gov + FIRE_1621 + 12 + 5 + 197.85350215805727 + 163.74672421202493 + + + FIRE + FIRE_1622@GraphGeneration.gov + FIRE_1622 + 7 + 5 + 178.62261933165505 + 165.83207821250983 + + + FIRE + FIRE_1624@GraphGeneration.gov + FIRE_1624 + 10 + 5 + 160.95677294511455 + 151.23202695119548 + + + FIRE + FIRE_1692@GraphGeneration.gov + FIRE_1692 + 6 + 5 + 29.373170203944603 + 174.90889705874497 + + + FIRE + FIRE_1702@GraphGeneration.gov + FIRE_1702 + 8 + 5 + 60.69423867302718 + 176.10454053464525 + + + FIRE + FIRE_1704@GraphGeneration.gov + FIRE_1704 + 12 + 5 + 40.95447675007475 + 187.00315923261275 + + + FIRE + FIRE_1707@GraphGeneration.gov + FIRE_1707 + 8 + 5 + 26.167521151110506 + 195.71440773327612 + + + FIRE + FIRE_1712@GraphGeneration.gov + FIRE_1712 + 12 + 5 + 2.806463483172572 + 195.55262793577097 + + + FIRE + FIRE_1714@GraphGeneration.gov + FIRE_1714 + 7 + 5 + 27.509579105339416 + 171.80678583401303 + + + FIRE + FIRE_1782@GraphGeneration.gov + FIRE_1782 + 11 + 5 + 101.42983651211074 + 188.34419088443835 + + + FIRE + FIRE_1784@GraphGeneration.gov + FIRE_1784 + 7 + 5 + 118.57129429654518 + 181.76300529370533 + + + FIRE + FIRE_1786@GraphGeneration.gov + FIRE_1786 + 7 + 5 + 133.25126490555778 + 192.95833867835418 + + + FIRE + FIRE_1787@GraphGeneration.gov + FIRE_1787 + 6 + 5 + 127.36737967322959 + 173.54218641660708 + + + FIRE + FIRE_1792@GraphGeneration.gov + FIRE_1792 + 11 + 5 + 130.22630111169434 + 186.65744840844042 + + + FIRE + FIRE_1794@GraphGeneration.gov + FIRE_1794 + 10 + 5 + 82.48165072863084 + 193.36084532671617 + + + FIRE + FIRE_1807@GraphGeneration.gov + FIRE_1807 + 10 + 5 + 131.94137560695495 + 171.6451324652708 + + + FIRE + FIRE_1808@GraphGeneration.gov + FIRE_1808 + 8 + 5 + 71.09088589524285 + 180.6276649013735 + + + FIRE + FIRE_1871@GraphGeneration.gov + FIRE_1871 + 11 + 5 + 197.80625055987184 + 179.90086657402907 + + + FIRE + FIRE_1875@GraphGeneration.gov + FIRE_1875 + 8 + 5 + 152.78821996155617 + 172.26420099806612 + + + FIRE + FIRE_1876@GraphGeneration.gov + FIRE_1876 + 11 + 5 + 135.07398625752347 + 182.51723508328 + + + FIRE + FIRE_1881@GraphGeneration.gov + FIRE_1881 + 11 + 5 + 158.7912732066102 + 192.92389047173694 + + + FIRE + FIRE_1882@GraphGeneration.gov + FIRE_1882 + 8 + 5 + 181.82066749477684 + 185.87109629825923 + + + FIRE + FIRE_1883@GraphGeneration.gov + FIRE_1883 + 12 + 5 + 139.44192782636736 + 179.55510662833706 + + + FIRE + FIRE_1886@GraphGeneration.gov + FIRE_1886 + 7 + 5 + 162.9348592417605 + 192.7305203427353 + + + FIRE + FIRE_1887@GraphGeneration.gov + FIRE_1887 + 7 + 5 + 171.4562411729933 + 196.87637422478286 + + + FIRE + FIRE_1896@GraphGeneration.gov + FIRE_1896 + 10 + 5 + 168.27569698640457 + 179.90498163990011 + + + LAW + LAW_61@GraphGeneration.gov + LAW_61 + 12 + 5 + 59.46086659267998 + 16.679183236660766 + + + LAW + LAW_63@GraphGeneration.gov + LAW_63 + 12 + 5 + 42.81463723173154 + 11.93792718973866 + + + LAW + LAW_64@GraphGeneration.gov + LAW_64 + 8 + 5 + 61.707169857495586 + 4.080567512219128 + + + LAW + LAW_73@GraphGeneration.gov + LAW_73 + 11 + 5 + 4.607483782674837 + 19.969629084091764 + + + LAW + LAW_82@GraphGeneration.gov + LAW_82 + 11 + 5 + 50.45474179370464 + 12.644785088756372 + + + LAW + LAW_89@GraphGeneration.gov + LAW_89 + 7 + 5 + 26.148939036650752 + 23.895127878082768 + + + LAW + LAW_153@GraphGeneration.gov + LAW_153 + 10 + 5 + 96.2081612703409 + 13.245566902063223 + + + LAW + LAW_158@GraphGeneration.gov + LAW_158 + 8 + 5 + 130.60862609557773 + 25.083446607248565 + + + LAW + LAW_160@GraphGeneration.gov + LAW_160 + 12 + 5 + 95.03871129384869 + 20.588399990603257 + + + LAW + LAW_161@GraphGeneration.gov + LAW_161 + 8 + 5 + 75.77109433170315 + 10.990588004449215 + + + LAW + LAW_162@GraphGeneration.gov + LAW_162 + 9 + 5 + 130.85628794976515 + 8.807261669962115 + + + LAW + LAW_163@GraphGeneration.gov + LAW_163 + 6 + 5 + 125.02335602036722 + 22.82339825435788 + + + LAW + LAW_164@GraphGeneration.gov + LAW_164 + 9 + 5 + 84.35712524639418 + 27.9351758163182 + + + LAW + LAW_168@GraphGeneration.gov + LAW_168 + 11 + 5 + 121.89078156654246 + 19.485765132677095 + + + LAW + LAW_169@GraphGeneration.gov + LAW_169 + 10 + 5 + 101.811551094822 + 18.41030990265005 + + + LAW + LAW_247@GraphGeneration.gov + LAW_247 + 9 + 5 + 184.85866548952953 + 27.31691320501529 + + + LAW + LAW_249@GraphGeneration.gov + LAW_249 + 6 + 5 + 197.11749229923004 + 4.628491932397574 + + + LAW + LAW_255@GraphGeneration.gov + LAW_255 + 12 + 5 + 179.43449865819665 + 15.93360064899215 + + + LAW + LAW_259@GraphGeneration.gov + LAW_259 + 9 + 5 + 187.96087295120364 + 28.270764638943664 + + + LAW + LAW_260@GraphGeneration.gov + LAW_260 + 12 + 5 + 187.55101799955804 + 22.717542971887756 + + + LAW + LAW_268@GraphGeneration.gov + LAW_268 + 10 + 5 + 155.9075819046226 + 14.510689802308322 + + + LAW + LAW_269@GraphGeneration.gov + LAW_269 + 7 + 5 + 168.80433786304403 + 6.38263021134613 + + + LAW + LAW_273@GraphGeneration.gov + LAW_273 + 12 + 5 + 162.5962523977139 + 19.034469655641058 + + + LAW + LAW_339@GraphGeneration.gov + LAW_339 + 10 + 5 + 18.752821384394352 + 53.080642644685796 + + + LAW + LAW_344@GraphGeneration.gov + LAW_344 + 12 + 5 + 14.193639308732099 + 40.82637596187844 + + + LAW + LAW_348@GraphGeneration.gov + LAW_348 + 7 + 5 + 5.05296893753322 + 54.11523596058261 + + + LAW + LAW_361@GraphGeneration.gov + LAW_361 + 8 + 5 + 14.63631953185444 + 48.8194885860945 + + + LAW + LAW_365@GraphGeneration.gov + LAW_365 + 11 + 5 + 23.10046212094433 + 50.7429757427969 + + + LAW + LAW_366@GraphGeneration.gov + LAW_366 + 9 + 5 + 49.899199955925 + 41.10826220860726 + + + LAW + LAW_437@GraphGeneration.gov + LAW_437 + 8 + 5 + 130.8851898229382 + 44.838509839580055 + + + LAW + LAW_442@GraphGeneration.gov + LAW_442 + 8 + 5 + 116.58500600102693 + 46.665902021462855 + + + LAW + LAW_445@GraphGeneration.gov + LAW_445 + 12 + 5 + 126.11101001234907 + 52.094718599566534 + + + LAW + LAW_447@GraphGeneration.gov + LAW_447 + 11 + 5 + 124.15891263249704 + 53.829732873260376 + + + LAW + LAW_449@GraphGeneration.gov + LAW_449 + 8 + 5 + 73.80481336795597 + 55.456595142276896 + + + LAW + LAW_450@GraphGeneration.gov + LAW_450 + 8 + 5 + 96.55005760959473 + 48.114876580012634 + + + LAW + LAW_454@GraphGeneration.gov + LAW_454 + 6 + 5 + 85.31715201715932 + 39.92947298397645 + + + LAW + LAW_458@GraphGeneration.gov + LAW_458 + 9 + 5 + 122.43581082095983 + 49.64599123912521 + + + LAW + LAW_528@GraphGeneration.gov + LAW_528 + 10 + 5 + 141.2149136833519 + 45.06785040620787 + + + LAW + LAW_530@GraphGeneration.gov + LAW_530 + 10 + 5 + 195.80503500898564 + 41.88161403148848 + + + LAW + LAW_537@GraphGeneration.gov + LAW_537 + 8 + 5 + 171.44384233870002 + 30.123544171115167 + + + LAW + LAW_540@GraphGeneration.gov + LAW_540 + 8 + 5 + 164.8258798331107 + 48.40554574771437 + + + LAW + LAW_542@GraphGeneration.gov + LAW_542 + 7 + 5 + 144.5073630733252 + 43.3721712662396 + + + LAW + LAW_543@GraphGeneration.gov + LAW_543 + 11 + 5 + 150.16794818464314 + 30.894423839038375 + + + LAW + LAW_549@GraphGeneration.gov + LAW_549 + 12 + 5 + 183.70302511386117 + 54.04660248817536 + + + LAW + LAW_550@GraphGeneration.gov + LAW_550 + 8 + 5 + 150.38076739097232 + 50.99749418350261 + + + LAW + LAW_615@GraphGeneration.gov + LAW_615 + 9 + 5 + 19.443009518626056 + 73.67863138923516 + + + LAW + LAW_616@GraphGeneration.gov + LAW_616 + 7 + 5 + 45.74319458761509 + 76.47451899812134 + + + LAW + LAW_618@GraphGeneration.gov + LAW_618 + 8 + 5 + 60.834728591098816 + 61.11737002374512 + + + LAW + LAW_622@GraphGeneration.gov + LAW_622 + 10 + 5 + 60.36930181562643 + 73.24377908612036 + + + LAW + LAW_623@GraphGeneration.gov + LAW_623 + 10 + 5 + 64.5103641760652 + 65.66320691323196 + + + LAW + LAW_626@GraphGeneration.gov + LAW_626 + 12 + 5 + 15.43172404396318 + 80.15828773126007 + + + LAW + LAW_628@GraphGeneration.gov + LAW_628 + 9 + 5 + 4.0142047151735305 + 77.96790946892699 + + + LAW + LAW_642@GraphGeneration.gov + LAW_642 + 7 + 5 + 21.47735966690001 + 66.02579246185908 + + + LAW + LAW_707@GraphGeneration.gov + LAW_707 + 9 + 5 + 106.30788680940512 + 66.88887832117187 + + + LAW + LAW_714@GraphGeneration.gov + LAW_714 + 9 + 5 + 113.57104709927968 + 59.840831668831214 + + + LAW + LAW_721@GraphGeneration.gov + LAW_721 + 12 + 5 + 105.00094966476121 + 78.29342320764992 + + + LAW + LAW_726@GraphGeneration.gov + LAW_726 + 10 + 5 + 106.92228616314495 + 70.58011325897762 + + + LAW + LAW_731@GraphGeneration.gov + LAW_731 + 10 + 5 + 109.57300813373757 + 59.29987260625923 + + + LAW + LAW_801@GraphGeneration.gov + LAW_801 + 8 + 5 + 143.05737022020784 + 57.8384409331188 + + + LAW + LAW_809@GraphGeneration.gov + LAW_809 + 8 + 5 + 159.95195256610762 + 68.67649284316728 + + + LAW + LAW_811@GraphGeneration.gov + LAW_811 + 8 + 5 + 156.76638560061707 + 70.24008933060395 + + + LAW + LAW_813@GraphGeneration.gov + LAW_813 + 9 + 5 + 166.10242358785504 + 73.68146928705995 + + + LAW + LAW_818@GraphGeneration.gov + LAW_818 + 7 + 5 + 172.69055198437934 + 62.360105348839966 + + + LAW + LAW_821@GraphGeneration.gov + LAW_821 + 8 + 5 + 134.25781235572657 + 80.39645331188414 + + + LAW + LAW_822@GraphGeneration.gov + LAW_822 + 11 + 5 + 172.26489412233968 + 76.81534571147641 + + + LAW + LAW_889@GraphGeneration.gov + LAW_889 + 8 + 5 + 50.821639965215915 + 95.30847862978318 + + + LAW + LAW_895@GraphGeneration.gov + LAW_895 + 11 + 5 + 39.93115855576791 + 105.45683355173475 + + + LAW + LAW_899@GraphGeneration.gov + LAW_899 + 11 + 5 + 49.56970770910599 + 104.61086681197524 + + + LAW + LAW_906@GraphGeneration.gov + LAW_906 + 7 + 5 + 4.911969677769079 + 97.07812200803282 + + + LAW + LAW_910@GraphGeneration.gov + LAW_910 + 8 + 5 + 36.46298523747435 + 103.95410486752897 + + + LAW + LAW_918@GraphGeneration.gov + LAW_918 + 8 + 5 + 24.092662272958552 + 95.53217685677012 + + + LAW + LAW_986@GraphGeneration.gov + LAW_986 + 11 + 5 + 81.2106109264756 + 92.70982116695893 + + + LAW + LAW_988@GraphGeneration.gov + LAW_988 + 9 + 5 + 100.7326012049693 + 97.57684933176282 + + + LAW + LAW_996@GraphGeneration.gov + LAW_996 + 12 + 5 + 132.2441088146435 + 91.5684288185356 + + + LAW + LAW_1002@GraphGeneration.gov + LAW_1002 + 12 + 5 + 90.78122164851361 + 88.01659242525598 + + + LAW + LAW_1003@GraphGeneration.gov + LAW_1003 + 6 + 5 + 111.73526369459586 + 111.23019960755255 + + + LAW + LAW_1004@GraphGeneration.gov + LAW_1004 + 9 + 5 + 118.60045785287576 + 86.52992632129997 + + + LAW + LAW_1074@GraphGeneration.gov + LAW_1074 + 10 + 5 + 171.50008884700208 + 108.86732230390952 + + + LAW + LAW_1078@GraphGeneration.gov + LAW_1078 + 6 + 5 + 146.53838178906173 + 89.45561432672078 + + + LAW + LAW_1096@GraphGeneration.gov + LAW_1096 + 11 + 5 + 146.13134199993976 + 114.02578003943853 + + + LAW + LAW_1100@GraphGeneration.gov + LAW_1100 + 10 + 5 + 164.29347805056295 + 90.57441033370182 + + + LAW + LAW_1102@GraphGeneration.gov + LAW_1102 + 9 + 5 + 146.53260579746697 + 114.03147145574714 + + + LAW + LAW_1165@GraphGeneration.gov + LAW_1165 + 12 + 5 + 0.507261773198368 + 125.67516135177978 + + + LAW + LAW_1170@GraphGeneration.gov + LAW_1170 + 6 + 5 + 45.81364315670845 + 116.75851929315094 + + + LAW + LAW_1185@GraphGeneration.gov + LAW_1185 + 8 + 5 + 26.379772129324653 + 140.54533179244322 + + + LAW + LAW_1193@GraphGeneration.gov + LAW_1193 + 10 + 5 + 4.3458759043294215 + 126.11591584880269 + + + LAW + LAW_1258@GraphGeneration.gov + LAW_1258 + 11 + 5 + 79.5717283558212 + 129.60328135962902 + + + LAW + LAW_1262@GraphGeneration.gov + LAW_1262 + 10 + 5 + 110.4402998860595 + 115.24066359373033 + + + LAW + LAW_1265@GraphGeneration.gov + LAW_1265 + 10 + 5 + 105.33950439096878 + 135.41254362999715 + + + LAW + LAW_1270@GraphGeneration.gov + LAW_1270 + 6 + 5 + 120.12624640994767 + 117.52887903683934 + + + LAW + LAW_1273@GraphGeneration.gov + LAW_1273 + 6 + 5 + 100.09320880865303 + 128.99089575765987 + + + LAW + LAW_1278@GraphGeneration.gov + LAW_1278 + 7 + 5 + 126.52381497953772 + 130.54231031453708 + + + LAW + LAW_1281@GraphGeneration.gov + LAW_1281 + 7 + 5 + 83.75954903116761 + 114.7082153840923 + + + LAW + LAW_1284@GraphGeneration.gov + LAW_1284 + 7 + 5 + 92.32749319580716 + 123.09023033844196 + + + LAW + LAW_1285@GraphGeneration.gov + LAW_1285 + 8 + 5 + 132.28094000743272 + 119.24617585355904 + + + LAW + LAW_1350@GraphGeneration.gov + LAW_1350 + 8 + 5 + 171.64973803161746 + 139.52056667625197 + + + LAW + LAW_1358@GraphGeneration.gov + LAW_1358 + 8 + 5 + 173.02514815170156 + 139.03093876978753 + + + LAW + LAW_1359@GraphGeneration.gov + LAW_1359 + 12 + 5 + 160.71056504223728 + 137.63604786287868 + + + LAW + LAW_1362@GraphGeneration.gov + LAW_1362 + 8 + 5 + 149.60774845289552 + 117.80285336615931 + + + LAW + LAW_1363@GraphGeneration.gov + LAW_1363 + 7 + 5 + 155.70973717083737 + 126.04798496438362 + + + LAW + LAW_1445@GraphGeneration.gov + LAW_1445 + 6 + 5 + 6.828478865906133 + 145.468745859172 + + + LAW + LAW_1446@GraphGeneration.gov + LAW_1446 + 12 + 5 + 11.027629433168848 + 152.40647733474916 + + + LAW + LAW_1447@GraphGeneration.gov + LAW_1447 + 7 + 5 + 63.146483877995045 + 166.61192546878138 + + + LAW + LAW_1450@GraphGeneration.gov + LAW_1450 + 11 + 5 + 25.801101878895484 + 160.66539042704562 + + + LAW + LAW_1454@GraphGeneration.gov + LAW_1454 + 10 + 5 + 6.034033282289346 + 171.17981716665338 + + + LAW + LAW_1456@GraphGeneration.gov + LAW_1456 + 9 + 5 + 62.38560054249399 + 159.11260703469193 + + + LAW + LAW_1462@GraphGeneration.gov + LAW_1462 + 11 + 5 + 36.36372722955533 + 157.23595663761276 + + + LAW + LAW_1463@GraphGeneration.gov + LAW_1463 + 8 + 5 + 4.802294849685929 + 169.87990723048145 + + + LAW + LAW_1465@GraphGeneration.gov + LAW_1465 + 8 + 5 + 21.383392971638532 + 169.30894566960492 + + + LAW + LAW_1533@GraphGeneration.gov + LAW_1533 + 7 + 5 + 122.40300188821143 + 158.57875508042756 + + + LAW + LAW_1539@GraphGeneration.gov + LAW_1539 + 10 + 5 + 125.82788956169765 + 153.4877998626903 + + + LAW + LAW_1543@GraphGeneration.gov + LAW_1543 + 7 + 5 + 92.23415980676658 + 147.49058760855732 + + + LAW + LAW_1545@GraphGeneration.gov + LAW_1545 + 7 + 5 + 103.18013217731266 + 143.41459305293867 + + + LAW + LAW_1549@GraphGeneration.gov + LAW_1549 + 11 + 5 + 98.03726460921875 + 149.87948278076004 + + + LAW + LAW_1553@GraphGeneration.gov + LAW_1553 + 12 + 5 + 92.26335603636434 + 164.11875354154017 + + + LAW + LAW_1558@GraphGeneration.gov + LAW_1558 + 9 + 5 + 98.67962894714708 + 145.97799007459304 + + + LAW + LAW_1625@GraphGeneration.gov + LAW_1625 + 9 + 5 + 149.3076364095453 + 164.4194808885039 + + + LAW + LAW_1628@GraphGeneration.gov + LAW_1628 + 6 + 5 + 145.87530120302537 + 149.5457028195602 + + + LAW + LAW_1631@GraphGeneration.gov + LAW_1631 + 10 + 5 + 144.79537203767526 + 158.56358073628775 + + + LAW + LAW_1633@GraphGeneration.gov + LAW_1633 + 7 + 5 + 135.06524748876365 + 162.14653327692415 + + + LAW + LAW_1642@GraphGeneration.gov + LAW_1642 + 7 + 5 + 199.32238172345797 + 162.72544885044272 + + + LAW + LAW_1650@GraphGeneration.gov + LAW_1650 + 8 + 5 + 177.51251201018633 + 162.8670609896868 + + + LAW + LAW_1724@GraphGeneration.gov + LAW_1724 + 6 + 5 + 26.995662756555976 + 194.5322095460531 + + + LAW + LAW_1725@GraphGeneration.gov + LAW_1725 + 7 + 5 + 59.48827267723811 + 173.78011051776735 + + + LAW + LAW_1732@GraphGeneration.gov + LAW_1732 + 9 + 5 + 49.18598447198394 + 175.61134769226828 + + + LAW + LAW_1741@GraphGeneration.gov + LAW_1741 + 9 + 5 + 21.403345706306556 + 173.62795686902857 + + + LAW + LAW_1810@GraphGeneration.gov + LAW_1810 + 11 + 5 + 107.01835730977709 + 188.18676367441705 + + + LAW + LAW_1811@GraphGeneration.gov + LAW_1811 + 9 + 5 + 69.71362525302392 + 187.4293313779999 + + + LAW + LAW_1825@GraphGeneration.gov + LAW_1825 + 8 + 5 + 84.95379354608227 + 192.31436405760496 + + + LAW + LAW_1830@GraphGeneration.gov + LAW_1830 + 12 + 5 + 96.35709352794608 + 172.5624388287186 + + + LAW + LAW_1902@GraphGeneration.gov + LAW_1902 + 11 + 5 + 178.52966624373067 + 199.30007104538697 + + + LAW + LAW_1907@GraphGeneration.gov + LAW_1907 + 6 + 5 + 196.15403680412132 + 177.41897475077909 + + + LAW + LAW_1915@GraphGeneration.gov + LAW_1915 + 12 + 5 + 183.50100244961305 + 188.99972556163533 + + + LAW + LAW_1919@GraphGeneration.gov + LAW_1919 + 9 + 5 + 141.07929427905066 + 188.38663281900293 + + + LAW + LAW_1920@GraphGeneration.gov + LAW_1920 + 6 + 5 + 164.7657134611667 + 188.9360438342048 + + + LAW + LAW_1925@GraphGeneration.gov + LAW_1925 + 6 + 5 + 144.47370149780727 + 191.2208448366464 + + + LAW + LAW_1926@GraphGeneration.gov + LAW_1926 + 9 + 5 + 149.54633158558678 + 183.63924723104657 + + + LAW + LAW_1928@GraphGeneration.gov + LAW_1928 + 8 + 5 + 177.64898548006585 + 179.8207930805039 + + + EMS + EMS_1@GraphGeneration.gov + EMS_1 + 8 + 6 + 66.26468345462672 + 2.45357055683403 + + + EMS + EMS_2@GraphGeneration.gov + EMS_2 + 9 + 6 + 35.12341236944062 + 18.908629275209627 + + + EMS + EMS_6@GraphGeneration.gov + EMS_6 + 11 + 6 + 45.679024476393614 + 18.29857579679067 + + + EMS + EMS_11@GraphGeneration.gov + EMS_11 + 8 + 6 + 63.09731639046904 + 27.704680543283498 + + + EMS + EMS_17@GraphGeneration.gov + EMS_17 + 11 + 6 + 59.21946338195637 + 22.184380120119183 + + + EMS + EMS_24@GraphGeneration.gov + EMS_24 + 6 + 6 + 10.128171679253366 + 9.383776443489777 + + + EMS + EMS_93@GraphGeneration.gov + EMS_93 + 9 + 6 + 132.46342634240943 + 20.71127824750598 + + + EMS + EMS_94@GraphGeneration.gov + EMS_94 + 8 + 6 + 89.77382829279756 + 7.109269302661717 + + + EMS + EMS_98@GraphGeneration.gov + EMS_98 + 11 + 6 + 131.394415610872 + 27.834294654513915 + + + EMS + EMS_103@GraphGeneration.gov + EMS_103 + 6 + 6 + 96.73530223634901 + 0.5177782786515722 + + + EMS + EMS_107@GraphGeneration.gov + EMS_107 + 8 + 6 + 112.95859205299624 + 0.16191383300611253 + + + EMS + EMS_115@GraphGeneration.gov + EMS_115 + 11 + 6 + 125.39295542591287 + 17.17407920545546 + + + EMS + EMS_122@GraphGeneration.gov + EMS_122 + 6 + 6 + 129.66735263235157 + 28.000547682251927 + + + EMS + EMS_186@GraphGeneration.gov + EMS_186 + 12 + 6 + 199.50774012576375 + 21.90057950549524 + + + EMS + EMS_190@GraphGeneration.gov + EMS_190 + 12 + 6 + 136.8307351527673 + 24.5622005609981 + + + EMS + EMS_195@GraphGeneration.gov + EMS_195 + 9 + 6 + 181.35690087122168 + 13.487036272518417 + + + EMS + EMS_198@GraphGeneration.gov + EMS_198 + 11 + 6 + 187.82821777249256 + 3.286517043465888 + + + EMS + EMS_201@GraphGeneration.gov + EMS_201 + 10 + 6 + 149.57598782996953 + 13.230006120625132 + + + EMS + EMS_204@GraphGeneration.gov + EMS_204 + 12 + 6 + 134.5212590334014 + 9.75821830230491 + + + EMS + EMS_210@GraphGeneration.gov + EMS_210 + 7 + 6 + 137.5037107868108 + 28.440570826391166 + + + EMS + EMS_211@GraphGeneration.gov + EMS_211 + 11 + 6 + 187.189861493793 + 13.516345798074202 + + + EMS + EMS_214@GraphGeneration.gov + EMS_214 + 11 + 6 + 144.71690041628443 + 10.634184199918668 + + + EMS + EMS_277@GraphGeneration.gov + EMS_277 + 7 + 6 + 37.81443088921228 + 52.65364742975298 + + + EMS + EMS_279@GraphGeneration.gov + EMS_279 + 7 + 6 + 63.06198215430677 + 55.03518541506005 + + + EMS + EMS_282@GraphGeneration.gov + EMS_282 + 8 + 6 + 6.275024224605271 + 50.83939561344232 + + + EMS + EMS_284@GraphGeneration.gov + EMS_284 + 12 + 6 + 6.624154929974665 + 32.01769190941457 + + + EMS + EMS_286@GraphGeneration.gov + EMS_286 + 9 + 6 + 28.047528716448586 + 41.611299525256555 + + + EMS + EMS_290@GraphGeneration.gov + EMS_290 + 7 + 6 + 48.742061934962344 + 56.905227494860306 + + + EMS + EMS_294@GraphGeneration.gov + EMS_294 + 12 + 6 + 30.589553207068192 + 54.331194880365956 + + + EMS + EMS_299@GraphGeneration.gov + EMS_299 + 9 + 6 + 48.10963121165737 + 55.80896630537832 + + + EMS + EMS_301@GraphGeneration.gov + EMS_301 + 10 + 6 + 53.34313167430671 + 42.533549390368414 + + + EMS + EMS_381@GraphGeneration.gov + EMS_381 + 10 + 6 + 89.81472559019723 + 56.76606196337859 + + + EMS + EMS_382@GraphGeneration.gov + EMS_382 + 11 + 6 + 89.97485450811769 + 38.52212912777572 + + + EMS + EMS_384@GraphGeneration.gov + EMS_384 + 12 + 6 + 125.67858134690049 + 54.71641559686523 + + + EMS + EMS_385@GraphGeneration.gov + EMS_385 + 10 + 6 + 101.65274922303345 + 37.10825873652651 + + + EMS + EMS_389@GraphGeneration.gov + EMS_389 + 7 + 6 + 90.65880355232757 + 54.32718910524126 + + + EMS + EMS_392@GraphGeneration.gov + EMS_392 + 8 + 6 + 108.09785387499295 + 43.19334823306389 + + + EMS + EMS_394@GraphGeneration.gov + EMS_394 + 8 + 6 + 105.44135283283867 + 39.55997959622701 + + + EMS + EMS_481@GraphGeneration.gov + EMS_481 + 10 + 6 + 153.34782755495883 + 28.92012566221913 + + + EMS + EMS_485@GraphGeneration.gov + EMS_485 + 12 + 6 + 141.63256877000111 + 42.730028702022736 + + + EMS + EMS_487@GraphGeneration.gov + EMS_487 + 7 + 6 + 151.60657932427455 + 32.97040792583494 + + + EMS + EMS_557@GraphGeneration.gov + EMS_557 + 11 + 6 + 60.530502638347954 + 75.34095094540727 + + + EMS + EMS_558@GraphGeneration.gov + EMS_558 + 12 + 6 + 34.182817810137365 + 67.28245583709798 + + + EMS + EMS_562@GraphGeneration.gov + EMS_562 + 7 + 6 + 53.567395531774984 + 85.46616571562933 + + + EMS + EMS_573@GraphGeneration.gov + EMS_573 + 6 + 6 + 52.91341376009387 + 71.08429482633305 + + + EMS + EMS_648@GraphGeneration.gov + EMS_648 + 8 + 6 + 133.11953944369037 + 62.978083038171974 + + + EMS + EMS_652@GraphGeneration.gov + EMS_652 + 10 + 6 + 98.71430265600196 + 60.840138142102525 + + + EMS + EMS_656@GraphGeneration.gov + EMS_656 + 6 + 6 + 89.60481996165763 + 74.29643046283023 + + + EMS + EMS_657@GraphGeneration.gov + EMS_657 + 10 + 6 + 107.28360213117364 + 68.84622992353952 + + + EMS + EMS_658@GraphGeneration.gov + EMS_658 + 9 + 6 + 123.95766837344208 + 69.89031989222791 + + + EMS + EMS_659@GraphGeneration.gov + EMS_659 + 12 + 6 + 72.92610168134446 + 73.73750857601318 + + + EMS + EMS_660@GraphGeneration.gov + EMS_660 + 12 + 6 + 92.2163715079123 + 69.93178668290403 + + + EMS + EMS_664@GraphGeneration.gov + EMS_664 + 7 + 6 + 125.15356132130792 + 79.05869746655142 + + + EMS + EMS_666@GraphGeneration.gov + EMS_666 + 11 + 6 + 100.60578427896004 + 63.48066666622355 + + + EMS + EMS_668@GraphGeneration.gov + EMS_668 + 8 + 6 + 95.61479618534263 + 80.44777735940804 + + + EMS + EMS_740@GraphGeneration.gov + EMS_740 + 10 + 6 + 144.75307067548636 + 70.55735343140528 + + + EMS + EMS_741@GraphGeneration.gov + EMS_741 + 8 + 6 + 197.89243999502332 + 58.556995083486164 + + + EMS + EMS_743@GraphGeneration.gov + EMS_743 + 6 + 6 + 153.93498970585216 + 62.09636326477876 + + + EMS + EMS_745@GraphGeneration.gov + EMS_745 + 11 + 6 + 177.1389805176084 + 72.12042621950674 + + + EMS + EMS_749@GraphGeneration.gov + EMS_749 + 8 + 6 + 136.5606202649411 + 75.77492601542578 + + + EMS + EMS_750@GraphGeneration.gov + EMS_750 + 8 + 6 + 180.97221885768974 + 58.56893267574057 + + + EMS + EMS_751@GraphGeneration.gov + EMS_751 + 7 + 6 + 144.9288741819409 + 62.22984606314405 + + + EMS + EMS_754@GraphGeneration.gov + EMS_754 + 7 + 6 + 174.5545848553992 + 69.7309614401217 + + + EMS + EMS_757@GraphGeneration.gov + EMS_757 + 8 + 6 + 153.95275299883687 + 82.13512852321841 + + + EMS + EMS_766@GraphGeneration.gov + EMS_766 + 11 + 6 + 144.89390765940507 + 85.313206997174 + + + EMS + EMS_829@GraphGeneration.gov + EMS_829 + 6 + 6 + 45.698443905157674 + 112.52973743567298 + + + EMS + EMS_835@GraphGeneration.gov + EMS_835 + 11 + 6 + 17.17974459819426 + 97.12513181855525 + + + EMS + EMS_837@GraphGeneration.gov + EMS_837 + 10 + 6 + 6.563283384883553 + 90.11740270904478 + + + EMS + EMS_839@GraphGeneration.gov + EMS_839 + 12 + 6 + 53.90267747557608 + 90.59545199001525 + + + EMS + EMS_845@GraphGeneration.gov + EMS_845 + 12 + 6 + 48.592939639725806 + 88.57080386081304 + + + EMS + EMS_848@GraphGeneration.gov + EMS_848 + 10 + 6 + 37.431121986230686 + 113.52748339065954 + + + EMS + EMS_854@GraphGeneration.gov + EMS_854 + 9 + 6 + 24.925666180527948 + 98.69541940967595 + + + EMS + EMS_855@GraphGeneration.gov + EMS_855 + 6 + 6 + 63.91856755972681 + 99.49554300535975 + + + EMS + EMS_858@GraphGeneration.gov + EMS_858 + 10 + 6 + 62.71403449452537 + 105.67521208446144 + + + EMS + EMS_921@GraphGeneration.gov + EMS_921 + 10 + 6 + 97.12309494419605 + 86.7019324910635 + + + EMS + EMS_925@GraphGeneration.gov + EMS_925 + 7 + 6 + 122.5792525783411 + 86.2445838106334 + + + EMS + EMS_928@GraphGeneration.gov + EMS_928 + 10 + 6 + 118.16958030569793 + 100.07780070564411 + + + EMS + EMS_929@GraphGeneration.gov + EMS_929 + 6 + 6 + 78.87276810363987 + 112.42354764212892 + + + EMS + EMS_933@GraphGeneration.gov + EMS_933 + 8 + 6 + 82.40427371192379 + 106.65120899473547 + + + EMS + EMS_942@GraphGeneration.gov + EMS_942 + 7 + 6 + 114.32438262004736 + 110.15884834127864 + + + EMS + EMS_945@GraphGeneration.gov + EMS_945 + 9 + 6 + 111.2266135913125 + 86.33386240310853 + + + EMS + EMS_947@GraphGeneration.gov + EMS_947 + 7 + 6 + 98.9535016494654 + 97.46047828193896 + + + EMS + EMS_1016@GraphGeneration.gov + EMS_1016 + 9 + 6 + 186.48506659363534 + 104.73296177593417 + + + EMS + EMS_1018@GraphGeneration.gov + EMS_1018 + 12 + 6 + 194.35245155306265 + 89.00164049463088 + + + EMS + EMS_1022@GraphGeneration.gov + EMS_1022 + 9 + 6 + 146.24297361586449 + 90.97424741383219 + + + EMS + EMS_1028@GraphGeneration.gov + EMS_1028 + 7 + 6 + 148.4080921297607 + 90.55269209917957 + + + EMS + EMS_1030@GraphGeneration.gov + EMS_1030 + 9 + 6 + 198.2061519829375 + 94.6713343421384 + + + EMS + EMS_1036@GraphGeneration.gov + EMS_1036 + 7 + 6 + 180.8859191878276 + 110.73056462605079 + + + EMS + EMS_1038@GraphGeneration.gov + EMS_1038 + 6 + 6 + 185.79795125322215 + 101.1949330097258 + + + EMS + EMS_1040@GraphGeneration.gov + EMS_1040 + 8 + 6 + 146.0261889881198 + 103.45612580858707 + + + EMS + EMS_1108@GraphGeneration.gov + EMS_1108 + 6 + 6 + 49.3096273527432 + 133.2509520298693 + + + EMS + EMS_1111@GraphGeneration.gov + EMS_1111 + 11 + 6 + 27.918298295069558 + 133.4674731742893 + + + EMS + EMS_1113@GraphGeneration.gov + EMS_1113 + 6 + 6 + 33.583150498733424 + 127.44181445992922 + + + EMS + EMS_1114@GraphGeneration.gov + EMS_1114 + 6 + 6 + 30.782299627754572 + 127.97906468750587 + + + EMS + EMS_1122@GraphGeneration.gov + EMS_1122 + 7 + 6 + 31.301514921580118 + 132.4648871502202 + + + EMS + EMS_1123@GraphGeneration.gov + EMS_1123 + 7 + 6 + 55.51752971715879 + 125.8474634228849 + + + EMS + EMS_1127@GraphGeneration.gov + EMS_1127 + 9 + 6 + 61.93606894439369 + 125.6423651239317 + + + EMS + EMS_1128@GraphGeneration.gov + EMS_1128 + 9 + 6 + 1.2422680760398506 + 139.6908564943871 + + + EMS + EMS_1129@GraphGeneration.gov + EMS_1129 + 6 + 6 + 54.26475226232227 + 128.58741127093722 + + + EMS + EMS_1198@GraphGeneration.gov + EMS_1198 + 8 + 6 + 131.7412378824884 + 117.662531112142 + + + EMS + EMS_1216@GraphGeneration.gov + EMS_1216 + 11 + 6 + 116.73062419184055 + 130.33764283776517 + + + EMS + EMS_1220@GraphGeneration.gov + EMS_1220 + 6 + 6 + 90.1491138250455 + 119.72932796110496 + + + EMS + EMS_1300@GraphGeneration.gov + EMS_1300 + 10 + 6 + 182.08518085687777 + 133.9434105583339 + + + EMS + EMS_1301@GraphGeneration.gov + EMS_1301 + 10 + 6 + 148.32794039400656 + 141.70722104726755 + + + EMS + EMS_1308@GraphGeneration.gov + EMS_1308 + 6 + 6 + 152.83763899149142 + 125.19025935062035 + + + EMS + EMS_1313@GraphGeneration.gov + EMS_1313 + 9 + 6 + 174.91503447933758 + 114.84897502057257 + + + EMS + EMS_1317@GraphGeneration.gov + EMS_1317 + 9 + 6 + 167.57129129397697 + 117.39435071679338 + + + EMS + EMS_1318@GraphGeneration.gov + EMS_1318 + 8 + 6 + 153.96477902872846 + 123.92896613698365 + + + EMS + EMS_1386@GraphGeneration.gov + EMS_1386 + 7 + 6 + 27.144410914366837 + 148.89347040118457 + + + EMS + EMS_1387@GraphGeneration.gov + EMS_1387 + 10 + 6 + 18.367428077505295 + 166.66262396249442 + + + EMS + EMS_1396@GraphGeneration.gov + EMS_1396 + 6 + 6 + 16.346119094213552 + 151.67261834191814 + + + EMS + EMS_1397@GraphGeneration.gov + EMS_1397 + 11 + 6 + 13.317149844400134 + 164.06287743191754 + + + EMS + EMS_1404@GraphGeneration.gov + EMS_1404 + 12 + 6 + 48.74005218339687 + 143.09832655882093 + + + EMS + EMS_1410@GraphGeneration.gov + EMS_1410 + 7 + 6 + 25.392824220999348 + 151.03536724070378 + + + EMS + EMS_1476@GraphGeneration.gov + EMS_1476 + 9 + 6 + 118.30667393816879 + 151.48604091931168 + + + EMS + EMS_1483@GraphGeneration.gov + EMS_1483 + 6 + 6 + 126.48347349668992 + 150.36223061772012 + + + EMS + EMS_1486@GraphGeneration.gov + EMS_1486 + 11 + 6 + 92.64131270764724 + 148.0625644673417 + + + EMS + EMS_1489@GraphGeneration.gov + EMS_1489 + 8 + 6 + 74.24250884605095 + 162.19200033423394 + + + EMS + EMS_1494@GraphGeneration.gov + EMS_1494 + 12 + 6 + 120.07552059918493 + 146.34676580719923 + + + EMS + EMS_1498@GraphGeneration.gov + EMS_1498 + 8 + 6 + 99.9829862164092 + 145.8082474013718 + + + EMS + EMS_1566@GraphGeneration.gov + EMS_1566 + 6 + 6 + 141.44193741011307 + 157.2548871114998 + + + EMS + EMS_1571@GraphGeneration.gov + EMS_1571 + 6 + 6 + 135.33260072119617 + 160.19652404840195 + + + EMS + EMS_1574@GraphGeneration.gov + EMS_1574 + 12 + 6 + 143.04685058933052 + 157.3815903974035 + + + EMS + EMS_1575@GraphGeneration.gov + EMS_1575 + 10 + 6 + 189.24070471813874 + 150.19807239498547 + + + EMS + EMS_1577@GraphGeneration.gov + EMS_1577 + 11 + 6 + 177.95619058412677 + 166.2561458431177 + + + EMS + EMS_1579@GraphGeneration.gov + EMS_1579 + 10 + 6 + 161.14772329874262 + 168.72776870597008 + + + EMS + EMS_1581@GraphGeneration.gov + EMS_1581 + 9 + 6 + 188.04616794558063 + 155.51981649400366 + + + EMS + EMS_1583@GraphGeneration.gov + EMS_1583 + 6 + 6 + 147.72730284845423 + 168.68655996149477 + + + EMS + EMS_1657@GraphGeneration.gov + EMS_1657 + 7 + 6 + 58.361494405018895 + 189.7391196488006 + + + EMS + EMS_1658@GraphGeneration.gov + EMS_1658 + 6 + 6 + 16.309938863564202 + 193.54373836666903 + + + EMS + EMS_1660@GraphGeneration.gov + EMS_1660 + 10 + 6 + 8.100659473907776 + 183.65109373772037 + + + EMS + EMS_1668@GraphGeneration.gov + EMS_1668 + 12 + 6 + 10.112206243368904 + 178.76480041458365 + + + EMS + EMS_1669@GraphGeneration.gov + EMS_1669 + 6 + 6 + 9.899415334923608 + 196.92465802678748 + + + EMS + EMS_1671@GraphGeneration.gov + EMS_1671 + 7 + 6 + 50.099165622955596 + 184.27344975295856 + + + EMS + EMS_1675@GraphGeneration.gov + EMS_1675 + 9 + 6 + 48.37249814823494 + 192.09015605195233 + + + EMS + EMS_1679@GraphGeneration.gov + EMS_1679 + 11 + 6 + 16.107232624872193 + 197.03320641766285 + + + EMS + EMS_1680@GraphGeneration.gov + EMS_1680 + 10 + 6 + 5.2882495849075895 + 179.33850304230455 + + + EMS + EMS_1681@GraphGeneration.gov + EMS_1681 + 6 + 6 + 34.89033727188682 + 199.16454836579217 + + + EMS + EMS_1684@GraphGeneration.gov + EMS_1684 + 10 + 6 + 52.40532161511462 + 179.21553242953368 + + + EMS + EMS_1753@GraphGeneration.gov + EMS_1753 + 11 + 6 + 105.55190758392003 + 178.33137646766022 + + + EMS + EMS_1767@GraphGeneration.gov + EMS_1767 + 7 + 6 + 114.3859280211994 + 196.77164672940796 + + + EMS + EMS_1769@GraphGeneration.gov + EMS_1769 + 12 + 6 + 122.70140607645243 + 195.69301733462336 + + + EMS + EMS_1771@GraphGeneration.gov + EMS_1771 + 9 + 6 + 107.87041007980488 + 192.83343058584305 + + + EMS + EMS_1844@GraphGeneration.gov + EMS_1844 + 7 + 6 + 149.26581065874817 + 178.38568578489753 + + + EMS + EMS_1846@GraphGeneration.gov + EMS_1846 + 8 + 6 + 183.37042286674074 + 172.4336316313108 + + + EMS + EMS_1853@GraphGeneration.gov + EMS_1853 + 10 + 6 + 149.4085664851389 + 185.82834099290875 + + + EMS + EMS_1855@GraphGeneration.gov + EMS_1855 + 9 + 6 + 150.134309740521 + 186.05789461806788 + + + EMS + EMS_1856@GraphGeneration.gov + EMS_1856 + 6 + 6 + 181.66272427519644 + 195.92388044439286 + + + EMS + EMS_1864@GraphGeneration.gov + EMS_1864 + 7 + 6 + 169.02416815794857 + 197.94364019435963 + + + FIRE + FIRE_31@GraphGeneration.gov + FIRE_31 + 8 + 6 + 9.207556300095963 + 20.597746987773224 + + + FIRE + FIRE_35@GraphGeneration.gov + FIRE_35 + 9 + 6 + 45.421599756641584 + 20.09814012543596 + + + FIRE + FIRE_40@GraphGeneration.gov + FIRE_40 + 9 + 6 + 3.9845410851147904 + 8.318756241921205 + + + FIRE + FIRE_45@GraphGeneration.gov + FIRE_45 + 11 + 6 + 21.906299493312694 + 0.028163284625388436 + + + FIRE + FIRE_48@GraphGeneration.gov + FIRE_48 + 10 + 6 + 36.20355864168486 + 19.57914973575831 + + + FIRE + FIRE_49@GraphGeneration.gov + FIRE_49 + 10 + 6 + 14.882516887710652 + 24.880215448031922 + + + FIRE + FIRE_50@GraphGeneration.gov + FIRE_50 + 11 + 6 + 37.79667829351956 + 0.6941723116521891 + + + FIRE + FIRE_53@GraphGeneration.gov + FIRE_53 + 11 + 6 + 15.177328163906926 + 21.476711760161812 + + + FIRE + FIRE_54@GraphGeneration.gov + FIRE_54 + 11 + 6 + 56.421430008476 + 11.50272665336304 + + + FIRE + FIRE_55@GraphGeneration.gov + FIRE_55 + 12 + 6 + 9.572052347328164 + 22.77566790208278 + + + FIRE + FIRE_58@GraphGeneration.gov + FIRE_58 + 10 + 6 + 65.83103193971151 + 7.945329429143868 + + + FIRE + FIRE_126@GraphGeneration.gov + FIRE_126 + 8 + 6 + 87.17912628431834 + 26.283413158549475 + + + FIRE + FIRE_129@GraphGeneration.gov + FIRE_129 + 12 + 6 + 100.71869708301953 + 0.08981087765922119 + + + FIRE + FIRE_131@GraphGeneration.gov + FIRE_131 + 8 + 6 + 66.96121677775665 + 12.886633838632276 + + + FIRE + FIRE_133@GraphGeneration.gov + FIRE_133 + 6 + 6 + 128.59489781042475 + 10.672179593210059 + + + FIRE + FIRE_134@GraphGeneration.gov + FIRE_134 + 10 + 6 + 121.48441685979553 + 1.3981919302513817 + + + FIRE + FIRE_139@GraphGeneration.gov + FIRE_139 + 8 + 6 + 110.9719484215506 + 12.344081258154304 + + + FIRE + FIRE_140@GraphGeneration.gov + FIRE_140 + 11 + 6 + 117.7833535860358 + 3.682180086831407 + + + FIRE + FIRE_142@GraphGeneration.gov + FIRE_142 + 8 + 6 + 131.31352825246674 + 13.494755034430181 + + + FIRE + FIRE_143@GraphGeneration.gov + FIRE_143 + 11 + 6 + 79.6495787501356 + 4.850691922096338 + + + FIRE + FIRE_146@GraphGeneration.gov + FIRE_146 + 7 + 6 + 76.15369633010567 + 20.96530301207304 + + + FIRE + FIRE_150@GraphGeneration.gov + FIRE_150 + 12 + 6 + 77.95031831702559 + 11.824956962074985 + + + FIRE + FIRE_225@GraphGeneration.gov + FIRE_225 + 12 + 6 + 167.81623480810805 + 10.687171801619828 + + + FIRE + FIRE_226@GraphGeneration.gov + FIRE_226 + 10 + 6 + 145.78938560707888 + 8.611136845710194 + + + FIRE + FIRE_227@GraphGeneration.gov + FIRE_227 + 12 + 6 + 135.68339411558563 + 4.818755589119588 + + + FIRE + FIRE_228@GraphGeneration.gov + FIRE_228 + 7 + 6 + 147.55378102749745 + 3.9651175941342234 + + + FIRE + FIRE_229@GraphGeneration.gov + FIRE_229 + 8 + 6 + 187.24101056797096 + 18.485904649495687 + + + FIRE + FIRE_230@GraphGeneration.gov + FIRE_230 + 9 + 6 + 187.61015296931924 + 4.688485777590636 + + + FIRE + FIRE_238@GraphGeneration.gov + FIRE_238 + 8 + 6 + 165.5260757588631 + 23.177248848479557 + + + FIRE + FIRE_239@GraphGeneration.gov + FIRE_239 + 8 + 6 + 144.00792273610617 + 10.799619054164461 + + + FIRE + FIRE_242@GraphGeneration.gov + FIRE_242 + 7 + 6 + 193.74861669930496 + 16.359268148865063 + + + FIRE + FIRE_308@GraphGeneration.gov + FIRE_308 + 11 + 6 + 19.39079797631056 + 47.72048935529895 + + + FIRE + FIRE_309@GraphGeneration.gov + FIRE_309 + 7 + 6 + 37.963547650242795 + 51.67623306298722 + + + FIRE + FIRE_313@GraphGeneration.gov + FIRE_313 + 6 + 6 + 21.145605515875552 + 50.54196054843541 + + + FIRE + FIRE_315@GraphGeneration.gov + FIRE_315 + 9 + 6 + 32.47721149689665 + 38.75140305313905 + + + FIRE + FIRE_319@GraphGeneration.gov + FIRE_319 + 9 + 6 + 5.246474065577826 + 43.806794444060515 + + + FIRE + FIRE_320@GraphGeneration.gov + FIRE_320 + 10 + 6 + 55.169070872989096 + 52.75583440908757 + + + FIRE + FIRE_323@GraphGeneration.gov + FIRE_323 + 9 + 6 + 18.05382773523233 + 54.67715370375733 + + + FIRE + FIRE_329@GraphGeneration.gov + FIRE_329 + 9 + 6 + 29.430616156761424 + 49.46853314345006 + + + FIRE + FIRE_332@GraphGeneration.gov + FIRE_332 + 11 + 6 + 52.17595303523966 + 51.99672023785168 + + + FIRE + FIRE_399@GraphGeneration.gov + FIRE_399 + 10 + 6 + 92.73316156174131 + 41.2870729148936 + + + FIRE + FIRE_401@GraphGeneration.gov + FIRE_401 + 11 + 6 + 113.5540587946084 + 41.49999758646793 + + + FIRE + FIRE_402@GraphGeneration.gov + FIRE_402 + 7 + 6 + 99.9915741527879 + 38.25166780482435 + + + FIRE + FIRE_404@GraphGeneration.gov + FIRE_404 + 8 + 6 + 79.36090178260781 + 51.551534539438556 + + + FIRE + FIRE_405@GraphGeneration.gov + FIRE_405 + 9 + 6 + 121.61135242113099 + 51.46155184432605 + + + FIRE + FIRE_407@GraphGeneration.gov + FIRE_407 + 8 + 6 + 113.40062212067251 + 45.29164526966383 + + + FIRE + FIRE_411@GraphGeneration.gov + FIRE_411 + 9 + 6 + 84.27917069769484 + 36.910708854687904 + + + FIRE + FIRE_412@GraphGeneration.gov + FIRE_412 + 8 + 6 + 98.83960778311692 + 52.11629611870038 + + + FIRE + FIRE_415@GraphGeneration.gov + FIRE_415 + 12 + 6 + 76.47704397356199 + 51.72934148917494 + + + FIRE + FIRE_418@GraphGeneration.gov + FIRE_418 + 10 + 6 + 66.70678590140238 + 40.864810749211486 + + + FIRE + FIRE_419@GraphGeneration.gov + FIRE_419 + 11 + 6 + 95.30983813993177 + 55.60356108419889 + + + FIRE + FIRE_422@GraphGeneration.gov + FIRE_422 + 11 + 6 + 71.37503275758276 + 44.41977695860838 + + + FIRE + FIRE_494@GraphGeneration.gov + FIRE_494 + 7 + 6 + 141.0061585356385 + 33.827108426712414 + + + FIRE + FIRE_500@GraphGeneration.gov + FIRE_500 + 7 + 6 + 148.66653844200394 + 50.22315361510498 + + + FIRE + FIRE_503@GraphGeneration.gov + FIRE_503 + 11 + 6 + 152.2649994095763 + 53.07734675659121 + + + FIRE + FIRE_507@GraphGeneration.gov + FIRE_507 + 9 + 6 + 147.4327657380386 + 42.08259520444051 + + + FIRE + FIRE_511@GraphGeneration.gov + FIRE_511 + 9 + 6 + 172.39357862813665 + 44.14988013410325 + + + FIRE + FIRE_515@GraphGeneration.gov + FIRE_515 + 8 + 6 + 195.23197402712594 + 42.270345926941005 + + + FIRE + FIRE_516@GraphGeneration.gov + FIRE_516 + 7 + 6 + 134.494663609205 + 43.53105154083578 + + + FIRE + FIRE_518@GraphGeneration.gov + FIRE_518 + 12 + 6 + 153.77334391000647 + 40.26956772346261 + + + FIRE + FIRE_583@GraphGeneration.gov + FIRE_583 + 8 + 6 + 6.281086780663052 + 61.03509225328853 + + + FIRE + FIRE_584@GraphGeneration.gov + FIRE_584 + 8 + 6 + 44.75926210212255 + 77.48766962791811 + + + FIRE + FIRE_594@GraphGeneration.gov + FIRE_594 + 12 + 6 + 60.98007700648892 + 68.80695699038593 + + + FIRE + FIRE_596@GraphGeneration.gov + FIRE_596 + 7 + 6 + 54.40295551115383 + 66.2760993226399 + + + FIRE + FIRE_600@GraphGeneration.gov + FIRE_600 + 8 + 6 + 51.392173549879985 + 67.26328382908098 + + + FIRE + FIRE_602@GraphGeneration.gov + FIRE_602 + 11 + 6 + 13.28431740225163 + 57.63611867259152 + + + FIRE + FIRE_606@GraphGeneration.gov + FIRE_606 + 8 + 6 + 6.633717596743842 + 82.29797905602932 + + + FIRE + FIRE_676@GraphGeneration.gov + FIRE_676 + 12 + 6 + 117.56772049623882 + 64.39876991444267 + + + FIRE + FIRE_681@GraphGeneration.gov + FIRE_681 + 7 + 6 + 66.96422306905843 + 81.9980623768112 + + + FIRE + FIRE_683@GraphGeneration.gov + FIRE_683 + 7 + 6 + 125.91062816954619 + 77.55982522915315 + + + FIRE + FIRE_685@GraphGeneration.gov + FIRE_685 + 10 + 6 + 81.07357105433485 + 68.38646417762412 + + + FIRE + FIRE_687@GraphGeneration.gov + FIRE_687 + 11 + 6 + 107.39903538101672 + 78.68222252595922 + + + FIRE + FIRE_695@GraphGeneration.gov + FIRE_695 + 7 + 6 + 130.78653395671233 + 73.87860077769528 + + + FIRE + FIRE_697@GraphGeneration.gov + FIRE_697 + 8 + 6 + 124.12994116661656 + 79.8418252699014 + + + FIRE + FIRE_702@GraphGeneration.gov + FIRE_702 + 12 + 6 + 84.29385208417686 + 60.6630092685321 + + + FIRE + FIRE_768@GraphGeneration.gov + FIRE_768 + 12 + 6 + 194.75821406377162 + 59.00367912720661 + + + FIRE + FIRE_770@GraphGeneration.gov + FIRE_770 + 6 + 6 + 148.25430089340165 + 81.3836275785727 + + + FIRE + FIRE_771@GraphGeneration.gov + FIRE_771 + 8 + 6 + 148.8307253060276 + 85.06462492631087 + + + FIRE + FIRE_772@GraphGeneration.gov + FIRE_772 + 11 + 6 + 170.7867919677484 + 70.75201948591109 + + + FIRE + FIRE_782@GraphGeneration.gov + FIRE_782 + 10 + 6 + 141.47679538329334 + 64.66782932677717 + + + FIRE + FIRE_783@GraphGeneration.gov + FIRE_783 + 9 + 6 + 142.89005007753042 + 75.5471459789196 + + + FIRE + FIRE_796@GraphGeneration.gov + FIRE_796 + 10 + 6 + 198.30670019345717 + 80.34394369843746 + + + FIRE + FIRE_859@GraphGeneration.gov + FIRE_859 + 7 + 6 + 27.110081979373163 + 97.56295667856254 + + + FIRE + FIRE_860@GraphGeneration.gov + FIRE_860 + 7 + 6 + 55.86898024640101 + 86.30164494616555 + + + FIRE + FIRE_867@GraphGeneration.gov + FIRE_867 + 8 + 6 + 65.17515111503153 + 111.58286537755315 + + + FIRE + FIRE_872@GraphGeneration.gov + FIRE_872 + 12 + 6 + 55.2356086002192 + 111.31886694379484 + + + FIRE + FIRE_874@GraphGeneration.gov + FIRE_874 + 6 + 6 + 47.203188239981635 + 99.47328739621749 + + + FIRE + FIRE_881@GraphGeneration.gov + FIRE_881 + 12 + 6 + 18.16262225809106 + 90.51569856525714 + + + FIRE + FIRE_883@GraphGeneration.gov + FIRE_883 + 12 + 6 + 6.825549678560165 + 114.24758566041038 + + + FIRE + FIRE_960@GraphGeneration.gov + FIRE_960 + 8 + 6 + 113.01143264643622 + 101.93012402916396 + + + FIRE + FIRE_966@GraphGeneration.gov + FIRE_966 + 10 + 6 + 89.54125061694936 + 95.91886249514764 + + + FIRE + FIRE_969@GraphGeneration.gov + FIRE_969 + 7 + 6 + 94.30676398711242 + 89.89653067965159 + + + FIRE + FIRE_970@GraphGeneration.gov + FIRE_970 + 7 + 6 + 99.24276597936718 + 97.89900175783461 + + + FIRE + FIRE_971@GraphGeneration.gov + FIRE_971 + 9 + 6 + 117.91308517262607 + 114.16864970660592 + + + FIRE + FIRE_980@GraphGeneration.gov + FIRE_980 + 11 + 6 + 123.02133825433441 + 112.13421115687031 + + + FIRE + FIRE_1043@GraphGeneration.gov + FIRE_1043 + 7 + 6 + 164.33358186038546 + 113.99156706013079 + + + FIRE + FIRE_1045@GraphGeneration.gov + FIRE_1045 + 8 + 6 + 158.77445016415675 + 111.342470388103 + + + FIRE + FIRE_1060@GraphGeneration.gov + FIRE_1060 + 7 + 6 + 161.01007125441276 + 107.70638153277524 + + + FIRE + FIRE_1065@GraphGeneration.gov + FIRE_1065 + 10 + 6 + 141.89203315218847 + 86.26318894341084 + + + FIRE + FIRE_1072@GraphGeneration.gov + FIRE_1072 + 10 + 6 + 190.1684905549835 + 86.92185257699445 + + + FIRE + FIRE_1135@GraphGeneration.gov + FIRE_1135 + 11 + 6 + 54.14873959748308 + 134.25369607820187 + + + FIRE + FIRE_1136@GraphGeneration.gov + FIRE_1136 + 9 + 6 + 55.70355602047234 + 130.68743568159783 + + + FIRE + FIRE_1139@GraphGeneration.gov + FIRE_1139 + 11 + 6 + 22.376155162658474 + 141.2873220604604 + + + FIRE + FIRE_1142@GraphGeneration.gov + FIRE_1142 + 9 + 6 + 16.889055718894216 + 130.70425946227863 + + + FIRE + FIRE_1146@GraphGeneration.gov + FIRE_1146 + 6 + 6 + 53.762410943440905 + 122.08650907285373 + + + FIRE + FIRE_1153@GraphGeneration.gov + FIRE_1153 + 11 + 6 + 26.150905569537137 + 139.62322579550948 + + + FIRE + FIRE_1156@GraphGeneration.gov + FIRE_1156 + 8 + 6 + 65.34679178525211 + 120.23883361069302 + + + FIRE + FIRE_1157@GraphGeneration.gov + FIRE_1157 + 12 + 6 + 33.59377399046832 + 131.92662881458205 + + + FIRE + FIRE_1160@GraphGeneration.gov + FIRE_1160 + 8 + 6 + 64.98778558643457 + 125.20009503305988 + + + FIRE + FIRE_1161@GraphGeneration.gov + FIRE_1161 + 8 + 6 + 42.64444158247167 + 133.69842521855986 + + + FIRE + FIRE_1163@GraphGeneration.gov + FIRE_1163 + 9 + 6 + 25.04356488445454 + 121.07674305613308 + + + FIRE + FIRE_1238@GraphGeneration.gov + FIRE_1238 + 11 + 6 + 110.62408702798118 + 129.62060826552047 + + + FIRE + FIRE_1244@GraphGeneration.gov + FIRE_1244 + 9 + 6 + 118.84252829936173 + 140.44955538168207 + + + FIRE + FIRE_1246@GraphGeneration.gov + FIRE_1246 + 11 + 6 + 84.17951398115542 + 115.8841758801842 + + + FIRE + FIRE_1248@GraphGeneration.gov + FIRE_1248 + 11 + 6 + 133.16174681653064 + 136.8216900942656 + + + FIRE + FIRE_1256@GraphGeneration.gov + FIRE_1256 + 8 + 6 + 92.48442046336483 + 117.85628396478934 + + + FIRE + FIRE_1326@GraphGeneration.gov + FIRE_1326 + 10 + 6 + 198.2808285790175 + 118.04780507457667 + + + FIRE + FIRE_1334@GraphGeneration.gov + FIRE_1334 + 9 + 6 + 170.8536105632048 + 117.02941995694789 + + + FIRE + FIRE_1338@GraphGeneration.gov + FIRE_1338 + 6 + 6 + 185.00484414271187 + 115.74430485753258 + + + FIRE + FIRE_1341@GraphGeneration.gov + FIRE_1341 + 6 + 6 + 142.32984843706737 + 114.50342553575243 + + + FIRE + FIRE_1343@GraphGeneration.gov + FIRE_1343 + 6 + 6 + 172.8637116210469 + 132.33891677375794 + + + FIRE + FIRE_1346@GraphGeneration.gov + FIRE_1346 + 12 + 6 + 191.46617596844746 + 137.67048501919768 + + + FIRE + FIRE_1347@GraphGeneration.gov + FIRE_1347 + 10 + 6 + 174.755116597576 + 139.19132107825294 + + + FIRE + FIRE_1348@GraphGeneration.gov + FIRE_1348 + 11 + 6 + 160.25244916800324 + 123.15512614358968 + + + FIRE + FIRE_1411@GraphGeneration.gov + FIRE_1411 + 6 + 6 + 10.161007144369643 + 147.95967963953132 + + + FIRE + FIRE_1413@GraphGeneration.gov + FIRE_1413 + 11 + 6 + 52.57386074791479 + 152.1744858387756 + + + FIRE + FIRE_1415@GraphGeneration.gov + FIRE_1415 + 7 + 6 + 35.94909124160886 + 148.4863781888748 + + + FIRE + FIRE_1416@GraphGeneration.gov + FIRE_1416 + 11 + 6 + 55.65487182809714 + 158.4991351307982 + + + FIRE + FIRE_1420@GraphGeneration.gov + FIRE_1420 + 6 + 6 + 16.096458204347567 + 148.95074853977135 + + + FIRE + FIRE_1421@GraphGeneration.gov + FIRE_1421 + 11 + 6 + 24.17113637584608 + 148.86110888448135 + + + FIRE + FIRE_1423@GraphGeneration.gov + FIRE_1423 + 9 + 6 + 57.642119600088826 + 150.81436038022113 + + + FIRE + FIRE_1425@GraphGeneration.gov + FIRE_1425 + 11 + 6 + 54.198042454371745 + 156.7690714763112 + + + FIRE + FIRE_1426@GraphGeneration.gov + FIRE_1426 + 10 + 6 + 7.622730711700728 + 169.32270697566958 + + + FIRE + FIRE_1427@GraphGeneration.gov + FIRE_1427 + 6 + 6 + 28.236746226497072 + 159.2461999564838 + + + FIRE + FIRE_1428@GraphGeneration.gov + FIRE_1428 + 11 + 6 + 38.16746776503991 + 170.47152691716363 + + + FIRE + FIRE_1430@GraphGeneration.gov + FIRE_1430 + 9 + 6 + 45.78359413207609 + 143.0110134302749 + + + FIRE + FIRE_1505@GraphGeneration.gov + FIRE_1505 + 12 + 6 + 70.11985071544575 + 152.69140751700795 + + + FIRE + FIRE_1507@GraphGeneration.gov + FIRE_1507 + 9 + 6 + 119.8742639610463 + 143.14737014999636 + + + FIRE + FIRE_1509@GraphGeneration.gov + FIRE_1509 + 9 + 6 + 107.58256754046181 + 155.0879771777383 + + + FIRE + FIRE_1511@GraphGeneration.gov + FIRE_1511 + 12 + 6 + 124.28672148957689 + 163.57050909042545 + + + FIRE + FIRE_1520@GraphGeneration.gov + FIRE_1520 + 9 + 6 + 108.6643668624817 + 151.82501599022225 + + + FIRE + FIRE_1523@GraphGeneration.gov + FIRE_1523 + 11 + 6 + 89.63066515400679 + 159.55264915551004 + + + FIRE + FIRE_1525@GraphGeneration.gov + FIRE_1525 + 9 + 6 + 86.02313171871442 + 147.53850628756817 + + + FIRE + FIRE_1527@GraphGeneration.gov + FIRE_1527 + 12 + 6 + 75.47939098327255 + 154.93040089484654 + + + FIRE + FIRE_1532@GraphGeneration.gov + FIRE_1532 + 9 + 6 + 121.49856602927872 + 142.9265350317031 + + + FIRE + FIRE_1596@GraphGeneration.gov + FIRE_1596 + 6 + 6 + 152.3584933032279 + 163.7355683352391 + + + FIRE + FIRE_1599@GraphGeneration.gov + FIRE_1599 + 7 + 6 + 160.50669818018832 + 146.20609523989384 + + + FIRE + FIRE_1607@GraphGeneration.gov + FIRE_1607 + 6 + 6 + 144.39782923076643 + 166.80533341563873 + + + FIRE + FIRE_1610@GraphGeneration.gov + FIRE_1610 + 6 + 6 + 140.39176377179191 + 166.25164285261866 + + + FIRE + FIRE_1611@GraphGeneration.gov + FIRE_1611 + 12 + 6 + 187.20879742318152 + 153.35836156178513 + + + FIRE + FIRE_1613@GraphGeneration.gov + FIRE_1613 + 10 + 6 + 148.25323723234436 + 161.64097942555844 + + + FIRE + FIRE_1614@GraphGeneration.gov + FIRE_1614 + 6 + 6 + 179.47450712407561 + 165.11834753376633 + + + FIRE + FIRE_1620@GraphGeneration.gov + FIRE_1620 + 10 + 6 + 193.84415308688313 + 146.3508637164472 + + + FIRE + FIRE_1691@GraphGeneration.gov + FIRE_1691 + 9 + 6 + 23.852298291564377 + 178.32333449468496 + + + FIRE + FIRE_1693@GraphGeneration.gov + FIRE_1693 + 11 + 6 + 55.72566177157897 + 181.02619481612012 + + + FIRE + FIRE_1696@GraphGeneration.gov + FIRE_1696 + 11 + 6 + 66.09285810928519 + 175.57601013870604 + + + FIRE + FIRE_1697@GraphGeneration.gov + FIRE_1697 + 8 + 6 + 24.156823736682274 + 197.37179801935756 + + + FIRE + FIRE_1715@GraphGeneration.gov + FIRE_1715 + 6 + 6 + 27.585786336894888 + 178.99150539688912 + + + FIRE + FIRE_1780@GraphGeneration.gov + FIRE_1780 + 11 + 6 + 118.36466193079211 + 188.15831148422504 + + + FIRE + FIRE_1785@GraphGeneration.gov + FIRE_1785 + 12 + 6 + 77.05040821455879 + 177.81720572831364 + + + FIRE + FIRE_1796@GraphGeneration.gov + FIRE_1796 + 6 + 6 + 88.00665520592314 + 186.27752461163618 + + + FIRE + FIRE_1797@GraphGeneration.gov + FIRE_1797 + 7 + 6 + 74.69414182601287 + 198.65713278313223 + + + FIRE + FIRE_1798@GraphGeneration.gov + FIRE_1798 + 8 + 6 + 82.8809799583146 + 184.68451035581455 + + + FIRE + FIRE_1799@GraphGeneration.gov + FIRE_1799 + 8 + 6 + 126.68840665764303 + 173.59189071302583 + + + FIRE + FIRE_1801@GraphGeneration.gov + FIRE_1801 + 12 + 6 + 89.89881365517522 + 171.91553348551815 + + + FIRE + FIRE_1802@GraphGeneration.gov + FIRE_1802 + 9 + 6 + 119.2426436863307 + 187.80548293855648 + + + FIRE + FIRE_1805@GraphGeneration.gov + FIRE_1805 + 12 + 6 + 85.15679981614639 + 183.36847712218804 + + + FIRE + FIRE_1873@GraphGeneration.gov + FIRE_1873 + 9 + 6 + 159.16577103140128 + 185.95996911003166 + + + FIRE + FIRE_1874@GraphGeneration.gov + FIRE_1874 + 10 + 6 + 191.96018493588883 + 184.24701804908207 + + + FIRE + FIRE_1884@GraphGeneration.gov + FIRE_1884 + 9 + 6 + 180.36691859133066 + 177.59699654882795 + + + FIRE + FIRE_1891@GraphGeneration.gov + FIRE_1891 + 10 + 6 + 141.72496067328512 + 187.60066185618373 + + + FIRE + FIRE_1894@GraphGeneration.gov + FIRE_1894 + 10 + 6 + 190.68754358597317 + 189.185165677892 + + + FIRE + FIRE_1895@GraphGeneration.gov + FIRE_1895 + 9 + 6 + 189.95748484569287 + 173.05686239190305 + + + FIRE + FIRE_1897@GraphGeneration.gov + FIRE_1897 + 9 + 6 + 191.04159002152346 + 190.49559927789846 + + + FIRE + FIRE_1900@GraphGeneration.gov + FIRE_1900 + 10 + 6 + 136.5070549507386 + 191.86132558267707 + + + LAW + LAW_62@GraphGeneration.gov + LAW_62 + 11 + 6 + 8.071273555046082 + 12.983129183943626 + + + LAW + LAW_69@GraphGeneration.gov + LAW_69 + 7 + 6 + 22.457525292347547 + 2.2780251771050604 + + + LAW + LAW_74@GraphGeneration.gov + LAW_74 + 6 + 6 + 24.501214946422607 + 7.365776996240113 + + + LAW + LAW_76@GraphGeneration.gov + LAW_76 + 11 + 6 + 58.3741650234566 + 25.745734312931337 + + + LAW + LAW_79@GraphGeneration.gov + LAW_79 + 10 + 6 + 66.6551943841176 + 27.120873412362254 + + + LAW + LAW_80@GraphGeneration.gov + LAW_80 + 10 + 6 + 30.366749288681824 + 14.14170306318767 + + + LAW + LAW_84@GraphGeneration.gov + LAW_84 + 12 + 6 + 41.35180394430549 + 24.22648405349615 + + + LAW + LAW_87@GraphGeneration.gov + LAW_87 + 8 + 6 + 53.63163811232599 + 28.37922233299979 + + + LAW + LAW_90@GraphGeneration.gov + LAW_90 + 11 + 6 + 21.638061148094103 + 20.08424983073117 + + + LAW + LAW_156@GraphGeneration.gov + LAW_156 + 9 + 6 + 68.56330165315899 + 23.746307753618325 + + + LAW + LAW_159@GraphGeneration.gov + LAW_159 + 9 + 6 + 121.43069204033137 + 12.640202580713698 + + + LAW + LAW_165@GraphGeneration.gov + LAW_165 + 12 + 6 + 86.03343911389659 + 19.63364834546613 + + + LAW + LAW_167@GraphGeneration.gov + LAW_167 + 6 + 6 + 117.53178723354674 + 22.986645827511484 + + + LAW + LAW_172@GraphGeneration.gov + LAW_172 + 9 + 6 + 91.38471475853808 + 25.758997200178776 + + + LAW + LAW_174@GraphGeneration.gov + LAW_174 + 11 + 6 + 116.04565307722552 + 16.391372685776695 + + + LAW + LAW_176@GraphGeneration.gov + LAW_176 + 9 + 6 + 71.50498111726684 + 18.562896791993552 + + + LAW + LAW_179@GraphGeneration.gov + LAW_179 + 7 + 6 + 112.46770024529553 + 8.223430017603903 + + + LAW + LAW_248@GraphGeneration.gov + LAW_248 + 8 + 6 + 198.29179423204738 + 4.586398286375653 + + + LAW + LAW_257@GraphGeneration.gov + LAW_257 + 11 + 6 + 151.98190969922558 + 11.01647804217379 + + + LAW + LAW_261@GraphGeneration.gov + LAW_261 + 9 + 6 + 167.23528020117223 + 9.605322524521434 + + + LAW + LAW_262@GraphGeneration.gov + LAW_262 + 10 + 6 + 193.68463114556425 + 4.789596024875412 + + + LAW + LAW_264@GraphGeneration.gov + LAW_264 + 12 + 6 + 193.33245011066128 + 17.52999521849482 + + + LAW + LAW_265@GraphGeneration.gov + LAW_265 + 12 + 6 + 140.72258905692127 + 20.577452733427606 + + + LAW + LAW_266@GraphGeneration.gov + LAW_266 + 9 + 6 + 151.25504954251295 + 19.87806697788139 + + + LAW + LAW_270@GraphGeneration.gov + LAW_270 + 7 + 6 + 195.49708177585234 + 18.52052664174878 + + + LAW + LAW_343@GraphGeneration.gov + LAW_343 + 10 + 6 + 1.9768479926903784 + 49.46077881054438 + + + LAW + LAW_345@GraphGeneration.gov + LAW_345 + 12 + 6 + 0.31165428189122346 + 46.6160987228401 + + + LAW + LAW_353@GraphGeneration.gov + LAW_353 + 11 + 6 + 24.289428184553465 + 30.751263577537365 + + + LAW + LAW_355@GraphGeneration.gov + LAW_355 + 7 + 6 + 59.565048702120826 + 32.29093290431986 + + + LAW + LAW_360@GraphGeneration.gov + LAW_360 + 6 + 6 + 62.70857698743547 + 51.67189310940903 + + + LAW + LAW_363@GraphGeneration.gov + LAW_363 + 7 + 6 + 55.73606386172908 + 53.11821324019623 + + + LAW + LAW_430@GraphGeneration.gov + LAW_430 + 11 + 6 + 100.778771920546 + 54.98787415666344 + + + LAW + LAW_433@GraphGeneration.gov + LAW_433 + 8 + 6 + 79.72220399704074 + 51.7522451340223 + + + LAW + LAW_434@GraphGeneration.gov + LAW_434 + 10 + 6 + 94.14541776180721 + 42.918339382534946 + + + LAW + LAW_435@GraphGeneration.gov + LAW_435 + 11 + 6 + 93.04719122638049 + 47.570813055468804 + + + LAW + LAW_438@GraphGeneration.gov + LAW_438 + 7 + 6 + 126.79747731938411 + 44.307004708908 + + + LAW + LAW_441@GraphGeneration.gov + LAW_441 + 9 + 6 + 102.83887340546883 + 45.55974995262498 + + + LAW + LAW_444@GraphGeneration.gov + LAW_444 + 10 + 6 + 127.60797537144622 + 55.28008444071192 + + + LAW + LAW_446@GraphGeneration.gov + LAW_446 + 6 + 6 + 113.86737493402586 + 47.043781281639255 + + + LAW + LAW_448@GraphGeneration.gov + LAW_448 + 7 + 6 + 132.14416620181882 + 50.11259670517509 + + + LAW + LAW_453@GraphGeneration.gov + LAW_453 + 6 + 6 + 84.94042422469869 + 49.477302432964755 + + + LAW + LAW_457@GraphGeneration.gov + LAW_457 + 10 + 6 + 73.22149150988199 + 43.87687140356069 + + + LAW + LAW_521@GraphGeneration.gov + LAW_521 + 11 + 6 + 179.5393304358358 + 35.36578107615213 + + + LAW + LAW_524@GraphGeneration.gov + LAW_524 + 7 + 6 + 172.96709440681315 + 42.35805242083244 + + + LAW + LAW_527@GraphGeneration.gov + LAW_527 + 8 + 6 + 167.5442581627492 + 45.528332847208155 + + + LAW + LAW_529@GraphGeneration.gov + LAW_529 + 9 + 6 + 165.97189719587217 + 44.40798725258254 + + + LAW + LAW_533@GraphGeneration.gov + LAW_533 + 10 + 6 + 197.46721748289667 + 48.71137508778557 + + + LAW + LAW_536@GraphGeneration.gov + LAW_536 + 10 + 6 + 196.31241811112983 + 31.52967000831231 + + + LAW + LAW_541@GraphGeneration.gov + LAW_541 + 7 + 6 + 189.1784796092055 + 39.307269869942665 + + + LAW + LAW_545@GraphGeneration.gov + LAW_545 + 7 + 6 + 161.7826237961951 + 31.26518281371564 + + + LAW + LAW_613@GraphGeneration.gov + LAW_613 + 9 + 6 + 16.493413358786025 + 59.41614390964615 + + + LAW + LAW_617@GraphGeneration.gov + LAW_617 + 10 + 6 + 19.78093651473376 + 70.71909048260733 + + + LAW + LAW_620@GraphGeneration.gov + LAW_620 + 11 + 6 + 20.467361524134976 + 74.63086448389578 + + + LAW + LAW_621@GraphGeneration.gov + LAW_621 + 12 + 6 + 51.709609402314676 + 77.10434476877013 + + + LAW + LAW_634@GraphGeneration.gov + LAW_634 + 10 + 6 + 42.6241357901327 + 64.57913072881172 + + + LAW + LAW_636@GraphGeneration.gov + LAW_636 + 9 + 6 + 55.744240983167174 + 61.06750599405438 + + + LAW + LAW_639@GraphGeneration.gov + LAW_639 + 8 + 6 + 56.594758372408045 + 59.70331318729627 + + + LAW + LAW_705@GraphGeneration.gov + LAW_705 + 10 + 6 + 83.45753932476758 + 84.87643939836397 + + + LAW + LAW_708@GraphGeneration.gov + LAW_708 + 6 + 6 + 71.13618229147158 + 70.4675261592083 + + + LAW + LAW_712@GraphGeneration.gov + LAW_712 + 11 + 6 + 125.88002500797725 + 76.3246761189794 + + + LAW + LAW_717@GraphGeneration.gov + LAW_717 + 10 + 6 + 85.5271383508973 + 69.60286283831738 + + + LAW + LAW_722@GraphGeneration.gov + LAW_722 + 8 + 6 + 83.00986383382191 + 82.19855389201946 + + + LAW + LAW_733@GraphGeneration.gov + LAW_733 + 12 + 6 + 73.82572904470409 + 75.1585348864616 + + + LAW + LAW_798@GraphGeneration.gov + LAW_798 + 9 + 6 + 139.72064110727814 + 58.63865691514377 + + + LAW + LAW_800@GraphGeneration.gov + LAW_800 + 10 + 6 + 192.1480710481861 + 60.573308589439506 + + + LAW + LAW_805@GraphGeneration.gov + LAW_805 + 12 + 6 + 151.0175443611817 + 85.47392332190039 + + + LAW + LAW_806@GraphGeneration.gov + LAW_806 + 10 + 6 + 150.09519684410387 + 64.38414672020221 + + + LAW + LAW_808@GraphGeneration.gov + LAW_808 + 9 + 6 + 137.50664683911063 + 66.6900645259366 + + + LAW + LAW_812@GraphGeneration.gov + LAW_812 + 8 + 6 + 181.84955922858688 + 63.553412881934754 + + + LAW + LAW_815@GraphGeneration.gov + LAW_815 + 10 + 6 + 164.909938316095 + 78.90454923038894 + + + LAW + LAW_819@GraphGeneration.gov + LAW_819 + 11 + 6 + 176.28604676723555 + 64.28422499584188 + + + LAW + LAW_820@GraphGeneration.gov + LAW_820 + 6 + 6 + 134.65538340756228 + 64.9272706756608 + + + LAW + LAW_824@GraphGeneration.gov + LAW_824 + 8 + 6 + 198.21688239719845 + 77.40434553325744 + + + LAW + LAW_890@GraphGeneration.gov + LAW_890 + 10 + 6 + 25.79684412542179 + 107.26812190544926 + + + LAW + LAW_891@GraphGeneration.gov + LAW_891 + 9 + 6 + 45.36051653856339 + 108.52519563496215 + + + LAW + LAW_893@GraphGeneration.gov + LAW_893 + 8 + 6 + 16.460790967339722 + 108.68927951391859 + + + LAW + LAW_894@GraphGeneration.gov + LAW_894 + 8 + 6 + 2.1884066494535155 + 86.84878631831627 + + + LAW + LAW_898@GraphGeneration.gov + LAW_898 + 6 + 6 + 23.306792543684125 + 107.78729592455817 + + + LAW + LAW_900@GraphGeneration.gov + LAW_900 + 8 + 6 + 30.63229283432906 + 107.14147092441976 + + + LAW + LAW_902@GraphGeneration.gov + LAW_902 + 8 + 6 + 6.786495389101662 + 111.88145265975136 + + + LAW + LAW_908@GraphGeneration.gov + LAW_908 + 7 + 6 + 19.818463725218983 + 92.85028258328046 + + + LAW + LAW_983@GraphGeneration.gov + LAW_983 + 8 + 6 + 87.06789628087722 + 101.28531042695022 + + + LAW + LAW_984@GraphGeneration.gov + LAW_984 + 7 + 6 + 94.02142780278879 + 98.431348839014 + + + LAW + LAW_985@GraphGeneration.gov + LAW_985 + 9 + 6 + 76.14888640226611 + 104.13979888215593 + + + LAW + LAW_987@GraphGeneration.gov + LAW_987 + 8 + 6 + 67.34004736816422 + 94.67285044019222 + + + LAW + LAW_990@GraphGeneration.gov + LAW_990 + 12 + 6 + 112.34345179340482 + 93.53761009806713 + + + LAW + LAW_994@GraphGeneration.gov + LAW_994 + 12 + 6 + 131.18900064837015 + 108.94596111319481 + + + LAW + LAW_997@GraphGeneration.gov + LAW_997 + 7 + 6 + 127.36191456856807 + 92.46062591833696 + + + LAW + LAW_998@GraphGeneration.gov + LAW_998 + 6 + 6 + 82.48967555469837 + 95.85015817084069 + + + LAW + LAW_999@GraphGeneration.gov + LAW_999 + 9 + 6 + 128.900539297871 + 90.13062520294874 + + + LAW + LAW_1005@GraphGeneration.gov + LAW_1005 + 12 + 6 + 67.03205880684392 + 100.50176987686007 + + + LAW + LAW_1007@GraphGeneration.gov + LAW_1007 + 6 + 6 + 69.59030203922872 + 98.65035686237148 + + + LAW + LAW_1075@GraphGeneration.gov + LAW_1075 + 12 + 6 + 171.39873260551457 + 95.01381249070296 + + + LAW + LAW_1076@GraphGeneration.gov + LAW_1076 + 6 + 6 + 151.4370021611704 + 95.20887675797145 + + + LAW + LAW_1079@GraphGeneration.gov + LAW_1079 + 9 + 6 + 147.04462550640895 + 105.87508318827712 + + + LAW + LAW_1086@GraphGeneration.gov + LAW_1086 + 11 + 6 + 175.1963280756591 + 103.90172042295427 + + + LAW + LAW_1087@GraphGeneration.gov + LAW_1087 + 10 + 6 + 170.9955893881085 + 92.89860144603641 + + + LAW + LAW_1088@GraphGeneration.gov + LAW_1088 + 11 + 6 + 140.02377915660077 + 90.3571228086752 + + + LAW + LAW_1094@GraphGeneration.gov + LAW_1094 + 8 + 6 + 135.99701190481673 + 87.33892270877176 + + + LAW + LAW_1095@GraphGeneration.gov + LAW_1095 + 7 + 6 + 166.96948377396524 + 90.81905126809933 + + + LAW + LAW_1098@GraphGeneration.gov + LAW_1098 + 8 + 6 + 139.47795595614284 + 103.88306922671036 + + + LAW + LAW_1099@GraphGeneration.gov + LAW_1099 + 10 + 6 + 199.3355891524452 + 104.02678034813296 + + + LAW + LAW_1101@GraphGeneration.gov + LAW_1101 + 7 + 6 + 174.6293739429142 + 94.70993882836437 + + + LAW + LAW_1168@GraphGeneration.gov + LAW_1168 + 9 + 6 + 50.54252944001924 + 129.28021836451012 + + + LAW + LAW_1173@GraphGeneration.gov + LAW_1173 + 11 + 6 + 57.948827146065746 + 129.15442780857617 + + + LAW + LAW_1175@GraphGeneration.gov + LAW_1175 + 8 + 6 + 39.37951498002639 + 139.5561816689234 + + + LAW + LAW_1176@GraphGeneration.gov + LAW_1176 + 9 + 6 + 64.59815736954052 + 134.83038343572477 + + + LAW + LAW_1179@GraphGeneration.gov + LAW_1179 + 6 + 6 + 17.273239613624792 + 119.5593932115376 + + + LAW + LAW_1180@GraphGeneration.gov + LAW_1180 + 7 + 6 + 62.90690026518288 + 129.5037053690226 + + + LAW + LAW_1183@GraphGeneration.gov + LAW_1183 + 7 + 6 + 29.13309995950299 + 128.14461642568952 + + + LAW + LAW_1186@GraphGeneration.gov + LAW_1186 + 8 + 6 + 54.22439901383653 + 137.93210121857678 + + + LAW + LAW_1192@GraphGeneration.gov + LAW_1192 + 8 + 6 + 11.65735559767862 + 133.8583696343689 + + + LAW + LAW_1194@GraphGeneration.gov + LAW_1194 + 12 + 6 + 53.13082553428375 + 130.83181921305706 + + + LAW + LAW_1257@GraphGeneration.gov + LAW_1257 + 11 + 6 + 98.24654754099703 + 123.30070252154643 + + + LAW + LAW_1263@GraphGeneration.gov + LAW_1263 + 9 + 6 + 118.98698385348237 + 119.35121322183741 + + + LAW + LAW_1269@GraphGeneration.gov + LAW_1269 + 7 + 6 + 67.95163084703252 + 116.5468891695808 + + + LAW + LAW_1272@GraphGeneration.gov + LAW_1272 + 11 + 6 + 104.13652461562778 + 139.62109523406522 + + + LAW + LAW_1274@GraphGeneration.gov + LAW_1274 + 10 + 6 + 91.9688402424747 + 118.08843167264834 + + + LAW + LAW_1279@GraphGeneration.gov + LAW_1279 + 10 + 6 + 68.86061849521225 + 129.63362206480815 + + + LAW + LAW_1280@GraphGeneration.gov + LAW_1280 + 8 + 6 + 98.31407059659583 + 138.87046532009558 + + + LAW + LAW_1282@GraphGeneration.gov + LAW_1282 + 11 + 6 + 68.36760596396095 + 140.34544234865007 + + + LAW + LAW_1352@GraphGeneration.gov + LAW_1352 + 7 + 6 + 175.25629931829315 + 135.1145295135168 + + + LAW + LAW_1353@GraphGeneration.gov + LAW_1353 + 7 + 6 + 135.3790747545418 + 126.17765650579945 + + + LAW + LAW_1356@GraphGeneration.gov + LAW_1356 + 11 + 6 + 144.90457211644394 + 138.34279004402367 + + + LAW + LAW_1357@GraphGeneration.gov + LAW_1357 + 11 + 6 + 163.40387304632182 + 117.02075564288718 + + + LAW + LAW_1368@GraphGeneration.gov + LAW_1368 + 11 + 6 + 180.50251665599842 + 114.88742257840586 + + + LAW + LAW_1369@GraphGeneration.gov + LAW_1369 + 11 + 6 + 169.61872798111827 + 136.46571620994305 + + + LAW + LAW_1371@GraphGeneration.gov + LAW_1371 + 12 + 6 + 176.0920580157724 + 129.12652414987056 + + + LAW + LAW_1377@GraphGeneration.gov + LAW_1377 + 7 + 6 + 169.70337241879835 + 134.59146259146755 + + + LAW + LAW_1443@GraphGeneration.gov + LAW_1443 + 11 + 6 + 50.92211053466439 + 171.24731011345162 + + + LAW + LAW_1444@GraphGeneration.gov + LAW_1444 + 12 + 6 + 16.863496583499018 + 167.56493366043185 + + + LAW + LAW_1452@GraphGeneration.gov + LAW_1452 + 9 + 6 + 63.81581196193265 + 149.40731440434354 + + + LAW + LAW_1467@GraphGeneration.gov + LAW_1467 + 12 + 6 + 64.20594869348896 + 150.25902665657216 + + + LAW + LAW_1469@GraphGeneration.gov + LAW_1469 + 10 + 6 + 44.53232500588525 + 165.86156408907274 + + + LAW + LAW_1470@GraphGeneration.gov + LAW_1470 + 10 + 6 + 30.95813087727774 + 160.65303660504682 + + + LAW + LAW_1534@GraphGeneration.gov + LAW_1534 + 11 + 6 + 86.10399416979334 + 167.9997605695715 + + + LAW + LAW_1547@GraphGeneration.gov + LAW_1547 + 6 + 6 + 103.33094130991981 + 166.67370077128055 + + + LAW + LAW_1550@GraphGeneration.gov + LAW_1550 + 12 + 6 + 91.41578794845239 + 144.1346631408702 + + + LAW + LAW_1551@GraphGeneration.gov + LAW_1551 + 11 + 6 + 120.31701459625981 + 151.9423362542079 + + + LAW + LAW_1552@GraphGeneration.gov + LAW_1552 + 8 + 6 + 73.4966158370113 + 147.6482364759146 + + + LAW + LAW_1554@GraphGeneration.gov + LAW_1554 + 9 + 6 + 120.66029576124936 + 146.3485253736143 + + + LAW + LAW_1560@GraphGeneration.gov + LAW_1560 + 7 + 6 + 119.84136723286386 + 146.19696213838785 + + + LAW + LAW_1629@GraphGeneration.gov + LAW_1629 + 6 + 6 + 195.89866745882824 + 162.96794633821642 + + + LAW + LAW_1630@GraphGeneration.gov + LAW_1630 + 9 + 6 + 182.46792225684834 + 157.96202008019176 + + + LAW + LAW_1636@GraphGeneration.gov + LAW_1636 + 6 + 6 + 185.78024835079134 + 169.46819781350464 + + + LAW + LAW_1637@GraphGeneration.gov + LAW_1637 + 11 + 6 + 162.2939040570675 + 163.9321459523377 + + + LAW + LAW_1641@GraphGeneration.gov + LAW_1641 + 10 + 6 + 160.74974495273497 + 159.5199860753686 + + + LAW + LAW_1647@GraphGeneration.gov + LAW_1647 + 10 + 6 + 191.0730204205159 + 151.4342258881016 + + + LAW + LAW_1648@GraphGeneration.gov + LAW_1648 + 10 + 6 + 141.02444942434033 + 164.1797870643768 + + + LAW + LAW_1717@GraphGeneration.gov + LAW_1717 + 8 + 6 + 34.96835078625864 + 198.13131947831718 + + + LAW + LAW_1718@GraphGeneration.gov + LAW_1718 + 6 + 6 + 26.709856700528267 + 174.65103610971227 + + + LAW + LAW_1720@GraphGeneration.gov + LAW_1720 + 7 + 6 + 57.77954549235006 + 174.97105858584862 + + + LAW + LAW_1726@GraphGeneration.gov + LAW_1726 + 10 + 6 + 49.71003985160487 + 185.4261408423239 + + + LAW + LAW_1727@GraphGeneration.gov + LAW_1727 + 6 + 6 + 60.66829756339196 + 197.2667025131988 + + + LAW + LAW_1728@GraphGeneration.gov + LAW_1728 + 10 + 6 + 35.174264467696624 + 198.99151942426496 + + + LAW + LAW_1733@GraphGeneration.gov + LAW_1733 + 6 + 6 + 53.97833884467537 + 177.25916969501625 + + + LAW + LAW_1736@GraphGeneration.gov + LAW_1736 + 9 + 6 + 34.941827017757845 + 188.97617064706824 + + + LAW + LAW_1744@GraphGeneration.gov + LAW_1744 + 8 + 6 + 45.817979384057445 + 184.01463447584794 + + + LAW + LAW_1812@GraphGeneration.gov + LAW_1812 + 6 + 6 + 116.63056961109797 + 176.4373279852318 + + + LAW + LAW_1816@GraphGeneration.gov + LAW_1816 + 7 + 6 + 85.4973585970373 + 183.4112687272665 + + + LAW + LAW_1817@GraphGeneration.gov + LAW_1817 + 6 + 6 + 116.28070453680263 + 189.16062164869675 + + + LAW + LAW_1821@GraphGeneration.gov + LAW_1821 + 9 + 6 + 81.77460756728718 + 189.78898777420017 + + + LAW + LAW_1833@GraphGeneration.gov + LAW_1833 + 10 + 6 + 89.89911048491061 + 175.71721071529797 + + + LAW + LAW_1834@GraphGeneration.gov + LAW_1834 + 9 + 6 + 87.05930557731436 + 173.1951911742013 + + + LAW + LAW_1901@GraphGeneration.gov + LAW_1901 + 6 + 6 + 149.12160713384222 + 175.1228821150548 + + + LAW + LAW_1904@GraphGeneration.gov + LAW_1904 + 12 + 6 + 173.4209039569393 + 177.03420648141292 + + + LAW + LAW_1909@GraphGeneration.gov + LAW_1909 + 7 + 6 + 161.51565828673768 + 174.1061945612829 + + + LAW + LAW_1910@GraphGeneration.gov + LAW_1910 + 11 + 6 + 141.56000714576862 + 198.17539763373048 + + + LAW + LAW_1911@GraphGeneration.gov + LAW_1911 + 8 + 6 + 194.93625852791274 + 186.7283914950643 + + + LAW + LAW_1922@GraphGeneration.gov + LAW_1922 + 12 + 6 + 137.16975832617118 + 173.1068172467817 + + + LAW + LAW_1923@GraphGeneration.gov + LAW_1923 + 9 + 6 + 148.19877916228577 + 182.2620972223647 + + + CALR + [(28.192974734694552, 17.415591290078353), (28.211560677969743, 17.417480365770604)], [(28.222871283729518, 17.436209445042987), (28.207670873695655, 17.450480065927863)], [(28.197962638798337, 17.44237681208586), (28.211097266306446, 17.421581300802735)], [(28.196125962449905, 17.419753705924883), (28.19273563431036, 17.415580693034325)], [(28.193845480491383, 17.45697527618969), (28.178372954948596, 17.432770445033768)], [(28.20386448013184, 17.455219082428894), (28.221219191476514, 17.4304435101126)], [(28.208798314609464, 17.454853876399486), (28.20653004934609, 17.459203481209563)], [(28.22668850507996, 17.409504312040692), (28.209779152863423, 17.43231370920954)], [(28.218232574869702, 17.411888726092503), (28.229185120843013, 17.429181020651086)], [(28.203726199350974, 17.44793599807924), (28.224413848314814, 17.44680751994396)], [(28.220324841088303, 17.451847667020644), (28.230589548456916, 17.435525915298598)], [(28.218701503573758, 17.448567459353562), (28.242534147856002, 17.458357484948433)], [(28.21805929092155, 17.453432028927075), (28.22519368272828, 17.456530820701094)], [(28.196211275960653, 17.43362402990572), (28.17387119485596, 17.42645828977122)], [(28.2208920093369, 17.440063461713624), (28.209415603405148, 17.46229589159039)], [(28.21355655267654, 17.413652181400842), (28.220841943833825, 17.411582268932218)], [(28.186896768027097, 17.457638806477505), (28.19846487861809, 17.433553269746156)], [(28.18268213945676, 17.412744914325735), (28.171110790893074, 17.424377249686255)], [(28.210153038522233, 17.438806250696487), (28.233507147993958, 17.446656062544932)], [(28.22081457868258, 17.41260364707714), (28.197293670796483, 17.40515081621297)], [(28.177653978747117, 17.446072470659153), (28.154213401393143, 17.422064825910166)], [(28.185809008336303, 17.43508152996227), (28.174164063611773, 17.411814673875167)], [(28.193057545130728, 17.40939277115761), (28.19203957544722, 17.40465525596183)], [(28.21056581082882, 17.447084406662103), (28.19018957257021, 17.453887309510577)], [(28.204588001572684, 17.41809308635037), (28.22084113388628, 17.414316983366195)], [(28.18611853075481, 17.44317684048204), (28.199853401123047, 17.463677247160195)], [(28.218300061415846, 17.44893166420752), (28.238281462666176, 17.437643459040963)], [(28.18735066565492, 17.439185653216676), (28.186176019051988, 17.432009203801947)], [(28.182701192813273, 17.44093552418812), (28.1951913680219, 17.45620547116343)], [(28.224544031407003, 17.43602178793673), (28.21976739213124, 17.41449729182272)], [(28.186302161698816, 17.440462454423514), (28.180528964989843, 17.45172369241225)], [(28.210924434601523, 17.44182650320359), (28.22717612706119, 17.419728917224216)], [(28.185618901220725, 17.428927969297884), (28.196625832329094, 17.446635379206334)], [(28.215243968211922, 17.42960859800682), (28.229862014310083, 17.405056784707284)], [(28.185790946772222, 17.43039190062945), (28.161314497219813, 17.407326564496987)], [(28.18039773131813, 17.434610941173645), (28.17294169293922, 17.436055764027312)], [(28.213465756577975, 17.411889382268907), (28.207824405306052, 17.42285929892228)], [(28.180034915450328, 17.456263364285256), (28.183424886562612, 17.462323529055126)], [(28.195912784361944, 17.416350108877694), (28.176961656932708, 17.41281412818986)], [(28.225968458145545, 17.433444944031162), (28.22142217669614, 17.426901824882556)], [(28.18841507632662, 17.457016203610337), (28.175103575813328, 17.47875356025594)], [(28.196227078375916, 17.415165973278636), (28.185635226908644, 17.401489327732932)], [(28.216932499985212, 17.44738922390857), (28.20043347708565, 17.471282150985406)], [(28.209862432977673, 17.41135644198893), (28.216181756818944, 17.419072570075272)], [(28.20872185530604, 17.434762998563496), (28.229936155078757, 17.45974135963739)], [(28.180714984273944, 17.435757034993795), (28.17923868225607, 17.435919411589065)], [(28.199709321568832, 17.438002598565365), (28.21828509546324, 17.41732874646586)], [(28.20525731978783, 17.449721086387893), (28.227385442166266, 17.42657152761901)], [(28.184162283922838, 17.436889385574034), (28.186917238823586, 17.442669534875694)], [(28.198084269583262, 17.458562113829274), (28.20198253265997, 17.478050815207393)] + CALL_91@GraphGeneration.gov + CALL_91 + + + CALR + [(126.40264495399387, 25.73246460917249), (126.41142702277672, 25.72833882813784)], [(126.41690723485442, 25.73398884958931), (126.40116208522316, 25.720222535636314)], [(126.42878602297291, 25.75251353535813), (126.41446582737137, 25.73740820436559)], [(126.39485362972322, 25.734378962247483), (126.37901407326353, 25.738209988600126)], [(126.41315441532491, 25.712714835090242), (126.38848934653515, 25.73084233832396)], [(126.4424871072922, 25.7233010505723), (126.44033131306026, 25.699117162262976)], [(126.43538093522706, 25.73638700413864), (126.44237145083514, 25.74040982739848)], [(126.41792683219809, 25.749482193400578), (126.43804727326437, 25.749282754056306)], [(126.41477244404362, 25.73206777777815), (126.39980623531504, 25.742784757176256)], [(126.42569888545783, 25.748049636627773), (126.42691357874283, 25.76798150456041)], [(126.39718655642132, 25.74216476356844), (126.4110261781727, 25.758471455733904)], [(126.43893078254288, 25.721082783123762), (126.42669379348082, 25.733553164429132)], [(126.4080156365891, 25.719822201948602), (126.42589677165842, 25.70900691294754)], [(126.40603131776201, 25.716376648310288), (126.41105564108425, 25.70723826364015)], [(126.4310188689147, 25.71787294067981), (126.45527332570451, 25.69901252591847)], [(126.41183364748917, 25.761828993953614), (126.42321310353388, 25.758797922069622)], [(126.42675950692436, 25.758547981174765), (126.43075925904304, 25.75168654684621)], [(126.43214649782153, 25.761430312354864), (126.43703778893124, 25.771307386442906)], [(126.41371431411459, 25.741304235135182), (126.41542678369719, 25.757775423822267)], [(126.42761849538286, 25.750657598202046), (126.40618743080915, 25.729401714194807)], [(126.41673367785815, 25.72742617394062), (126.40773522664583, 25.720193365676618)], [(126.4423793784044, 25.75259377380968), (126.46158872685814, 25.746318967695334)], [(126.41116378631526, 25.756732433733465), (126.3930765619807, 25.738891821167144)], [(126.41042219104126, 25.732077373268933), (126.43541696677563, 25.715402954345084)], [(126.43362426262635, 25.72619595380997), (126.42477442524837, 25.734850036790135)], [(126.40460810006549, 25.716771172636406), (126.41731057019693, 25.72186649467374)], [(126.4055161326795, 25.71536322910475), (126.41035518367354, 25.720835960380754)], [(126.41893337315787, 25.75517027143117), (126.42048428788554, 25.772274336271586)], [(126.41620583918727, 25.740874021090924), (126.39838468589312, 25.727598530162695)], [(126.41575552158069, 25.71626966372106), (126.40429144351559, 25.734136642634166)], [(126.42377943641769, 25.72526181482516), (126.40314430902626, 25.724812082691837)], [(126.4401031172939, 25.745420865935085), (126.45810606104764, 25.749192535388328)], [(126.44095971610491, 25.744115760293138), (126.42729862647192, 25.753191983110362)], [(126.3977207027213, 25.737361957831002), (126.41347617414098, 25.749990723370967)], [(126.39354890058902, 25.761792025729743), (126.37329354496873, 25.765896002532845)], [(126.42516632864181, 25.754896379031052), (126.43330780581273, 25.74820473284452)], [(126.43996588596565, 25.732989347319965), (126.41578816162794, 25.715171277278525)], [(126.40227001089488, 25.720067167962007), (126.38774042536852, 25.697393365985974)], [(126.42044148687974, 25.749410138973627), (126.40224554053414, 25.751764066598838)], [(126.41924646758557, 25.714428619249922), (126.40583220078129, 25.700944952671325)], [(126.44154704451482, 25.744365154564246), (126.46081971164561, 25.725918438283166)], [(126.39834492762192, 25.748786902587486), (126.37587765772139, 25.76833869156376)], [(126.40631865141302, 25.72825917028076), (126.42677082966297, 25.74473291176955)], [(126.43489803232768, 25.76232442228689), (126.41642474153204, 25.77643456246859)], [(126.39587435029203, 25.72651284306595), (126.37971343221825, 25.70807994047752)], [(126.39819863282399, 25.74217906160528), (126.37624750657251, 25.75131961214156)], [(126.40903141144159, 25.722510445865257), (126.42251276461353, 25.719973698376336)], [(126.43650874291993, 25.744050357636567), (126.42469602368271, 25.723683097362077)], [(126.4137270785693, 25.736811693862325), (126.40370399139539, 25.725093539795246)], [(126.44062468779303, 25.737305560494914), (126.42597894552166, 25.758164688984277)] + CALL_183@GraphGeneration.gov + CALL_183 + + + CALR + [(169.91087761996346, 19.19728301396311), (169.8993215235341, 19.184462120917818)], [(169.88857305103343, 19.240130902666195), (169.89609954176117, 19.2576249743385)], [(169.88946949227582, 19.2184597936859), (169.87659680859593, 19.20292090602027)], [(169.89891910612621, 19.23219313547583), (169.90794779270666, 19.207800678063347)], [(169.91531599605005, 19.21704438813331), (169.8967076874796, 19.207905091839333)], [(169.92069082405828, 19.2026153593433), (169.90990263745815, 19.197418897458533)], [(169.90675174248676, 19.20330810312753), (169.8884048632234, 19.209924620912012)], [(169.91970887608886, 19.217214940376234), (169.90900604219354, 19.193458894239388)], [(169.8874849834112, 19.238548052819862), (169.87098732510847, 19.25032233912598)], [(169.90781507655964, 19.197950527599293), (169.9281223851319, 19.208762729609973)], [(169.89170206418152, 19.23537037994303), (169.90987349431947, 19.238632616958856)], [(169.88450265023104, 19.21830638409907), (169.9077909945297, 19.22808708306259)], [(169.87717273351095, 19.21796581224818), (169.85339772714832, 19.20593891297069)], [(169.89194755222724, 19.200106028377604), (169.87884919096936, 19.20723693778627)], [(169.8793112375289, 19.203564803407666), (169.87303067163487, 19.204482291825173)], [(169.9009880396458, 19.225526900669024), (169.87892344824957, 19.241244177546886)], [(169.9113944271277, 19.2010725195278), (169.9311997950514, 19.210399588523995)], [(169.92195978648283, 19.210651567761982), (169.91268198495138, 19.21198157868879)], [(169.91857294199792, 19.217236093364225), (169.93801719471736, 19.2225429047954)], [(169.9041938013455, 19.241473233366612), (169.92693088325402, 19.26284773076718)], [(169.91583842366265, 19.234689076169662), (169.9059749977809, 19.212282201468593)], [(169.92245108970866, 19.23489402397383), (169.90534091057953, 19.21664826205276)], [(169.9045568748467, 19.22628314024962), (169.9024028279257, 19.215094139534223)], [(169.88472327583023, 19.2438023364582), (169.87951225807134, 19.226600010296966)], [(169.90089899315427, 19.217825114989683), (169.92539090305698, 19.209907768614425)], [(169.88320893595758, 19.21532078692773), (169.86327138237667, 19.194389461025057)], [(169.9216192943834, 19.208390728237582), (169.9245056280324, 19.193541033258846)], [(169.89299966571062, 19.213627413535935), (169.89700982454923, 19.198733145289154)], [(169.89486322569294, 19.210841332311094), (169.89763708647493, 19.23298903809964)], [(169.91569051108388, 19.19576841119223), (169.9216270075197, 19.218220532856215)], [(169.91213182943594, 19.228315006638773), (169.9029249955781, 19.24495427763784)], [(169.89994962950288, 19.20207997293547), (169.8766904522473, 19.198722466127542)], [(169.89742036144003, 19.21668749895295), (169.90599491909805, 19.23644276778002)], [(169.89212766617297, 19.233075737214943), (169.87446100848507, 19.209399531885275)], [(169.91114518620577, 19.23883942227009), (169.9325534069199, 19.24138864863035)], [(169.89128286096616, 19.242167393694864), (169.90520158920424, 19.263222078995824)], [(169.91243822003176, 19.238989146766183), (169.93578118330083, 19.234211895593276)], [(169.884763219594, 19.24019538802894), (169.8688742524321, 19.230740495359278)], [(169.90969960950403, 19.239279016507183), (169.89957480764477, 19.22966279320826)], [(169.8787835779844, 19.21350410684055), (169.86057125339704, 19.216963170833797)], [(169.88488793576226, 19.207867698101396), (169.88897726051704, 19.211069919486086)], [(169.92047198925601, 19.245284304170752), (169.90122245357497, 19.226540385810356)], [(169.90358260037874, 19.242374922081613), (169.89783583823854, 19.240980469075332)], [(169.89081259351002, 19.212133726877486), (169.87743703320442, 19.20035836002248)], [(169.8928531846157, 19.197351130721202), (169.91711878146762, 19.207456939011582)], [(169.9028566318376, 19.214088124836238), (169.9040244150663, 19.193344222311016)], [(169.90254445691744, 19.236702961985507), (169.90063002474201, 19.258986304003088)], [(169.8768905805441, 19.241250969139763), (169.85685832220545, 19.233963181370157)], [(169.89782576542814, 19.23408343086982), (169.8832155151794, 19.219765600942832)], [(169.87479351745978, 19.22275595746362), (169.87904083206988, 19.21229538783589)] + CALL_275@GraphGeneration.gov + CALL_275 + + + CALR + [(19.861249240491404, 34.568312233563795), (19.884396590591255, 34.56834241543149)], [(19.858892593180432, 34.567840315708665), (19.83697075764663, 34.57890966482323)], [(19.816914098913767, 34.56531106455968), (19.83580410657321, 34.56696759645567)], [(19.85312926617048, 34.565301283539384), (19.844831234355887, 34.589463718228124)], [(19.85395814609181, 34.57611533012139), (19.87890518098706, 34.599281746138615)], [(19.835209971100234, 34.58243238053935), (19.822701324118697, 34.59532866331894)], [(19.83383054285717, 34.571922859381544), (19.820468179830637, 34.57931883323353)], [(19.828478335336158, 34.58484074481862), (19.844323072196342, 34.59765164244041)], [(19.84827641294649, 34.571320831620426), (19.846616398614913, 34.589606623058756)], [(19.838022489478888, 34.57756529807583), (19.832696599808983, 34.57043796660825)], [(19.825594330841383, 34.58974959977346), (19.81464509469414, 34.586689368610806)], [(19.831275885183892, 34.59322592362046), (19.82804243332442, 34.61272518497687)], [(19.834566679255982, 34.58317941746567), (19.813049655055586, 34.564078987334845)], [(19.84445831101446, 34.59990097645166), (19.834546297041893, 34.578871825367)], [(19.84421298548064, 34.58805369462215), (19.867230887377044, 34.60375612201126)], [(19.848724735564154, 34.597299074966124), (19.834638253716975, 34.57713553783266)], [(19.824335112464155, 34.60281788670054), (19.80245862588204, 34.60714297437677)], [(19.838141578435877, 34.579117288324326), (19.816269449201073, 34.59998948295485)], [(19.827756605818966, 34.59602212978889), (19.84985191549187, 34.61233095446803)], [(19.819945499711505, 34.57070198632481), (19.810796722359363, 34.55153390857791)], [(19.835422624703693, 34.56663658749969), (19.84211144796833, 34.56112599872581)], [(19.821532251537672, 34.58133910614914), (19.7993529278607, 34.583153908661224)], [(19.863470652968175, 34.59042544733469), (19.87068756135864, 34.5744474799377)], [(19.824437443982536, 34.5992140525788), (19.845623849366156, 34.61196027652236)], [(19.832386309883145, 34.576019573845585), (19.818918908266564, 34.583808947625144)], [(19.82952099877992, 34.58675735745693), (19.833063890152882, 34.576771796221415)], [(19.822830273532702, 34.59060618395275), (19.833177993658786, 34.565931386846636)], [(19.84673339354129, 34.60312553474753), (19.868061688342422, 34.59128451640229)], [(19.860248883775814, 34.604149139491106), (19.87001996957681, 34.61629600928974)], [(19.82954604221084, 34.57142327967412), (19.83549954304909, 34.55339784481341)], [(19.83047555556771, 34.567218218675926), (19.834089592763426, 34.58557239339348)], [(19.8336638784771, 34.58731964134183), (19.810123148265628, 34.58160795850909)], [(19.856961597746054, 34.572210591075525), (19.845485675934867, 34.568480303468576)], [(19.82913582542188, 34.595919297268516), (19.84038716914776, 34.588226675518875)], [(19.829042474692827, 34.59090267357278), (19.81420352803036, 34.58576224528702)], [(19.852587576064156, 34.57938507780434), (19.837781462705863, 34.58518722742111)], [(19.81738905009933, 34.589101844665834), (19.838567591860627, 34.58529729740725)], [(19.81522126122346, 34.60048184255409), (19.831630657453115, 34.57900587259991)], [(19.836983184200218, 34.56759448084866), (19.815791326046984, 34.57809999902978)], [(19.841110699323124, 34.57007765655291), (19.82666501833102, 34.59327941352239)], [(19.81418827774882, 34.58724146047187), (19.82114343458634, 34.593463296351466)], [(19.81590809269901, 34.57962678035564), (19.82359273323923, 34.59895492842197)], [(19.85644157530007, 34.56964121955412), (19.837526111331382, 34.55751044220701)], [(19.824923643767086, 34.59619053097671), (19.847944466167903, 34.58698609405265)], [(19.858850094927533, 34.58790743584929), (19.85981114363975, 34.60436592000378)], [(19.840994061554312, 34.5702345488768), (19.856666066195885, 34.5909160387309)], [(19.844473010153404, 34.57373708282569), (19.84985136574482, 34.55545134210794)], [(19.862565691196256, 34.57119922137006), (19.842183521550893, 34.56162883572436)], [(19.82580331831397, 34.57766866005548), (19.815201568008717, 34.59567681082293)], [(19.82256773584722, 34.60310951949664), (19.825447590741124, 34.625895724210615)] + CALL_367@GraphGeneration.gov + CALL_367 + + + CALR + [(124.50848572999426, 42.066073706563515), (124.48686693460857, 42.04795321659233)], [(124.52987320897054, 42.07353400626101), (124.54693118679721, 42.0794130055177)], [(124.51842995710369, 42.054702818878994), (124.5376264827995, 42.07723021204883)], [(124.51532764511931, 42.04787380576922), (124.49978298857715, 42.05531692083052)], [(124.49293634333578, 42.06942897062261), (124.49694533528393, 42.09042101343851)], [(124.53178808735615, 42.07523103796555), (124.55449788041174, 42.05731687748771)], [(124.51686446652565, 42.05849346171109), (124.5337280103844, 42.04083874688373)], [(124.51788725961362, 42.06949457057277), (124.51655051192007, 42.09218230842682)], [(124.52708523905096, 42.07978381995792), (124.51285770329912, 42.093129220069834)], [(124.49914683031237, 42.047273422261554), (124.47846005412987, 42.037230370145586)], [(124.49398923610362, 42.053120314692784), (124.49690071892121, 42.06534159967974)], [(124.5403496343961, 42.08180589790021), (124.52861488274108, 42.0601288187448)], [(124.50706106864254, 42.043862059901535), (124.48502241012424, 42.04983001044632)], [(124.53059493058909, 42.03863623839841), (124.52807963752477, 42.01711198874787)], [(124.52905197558064, 42.06508353045607), (124.5338261849245, 42.046461502439264)], [(124.50578607660506, 42.0403780933565), (124.48289463965429, 42.05184095887307)], [(124.51449479842333, 42.05348356409095), (124.51557034329028, 42.0747013766578)], [(124.52140199600281, 42.045945272817846), (124.51681206078067, 42.067243145725264)], [(124.53733737279309, 42.06814321693005), (124.54038138754937, 42.05876008800366)], [(124.52367056708746, 42.041103166742445), (124.52639090981955, 42.03003186444742)], [(124.53278749691665, 42.041099334404485), (124.52219785191747, 42.03003881297481)], [(124.53357683622785, 42.07143782970288), (124.53057528392435, 42.083580173129995)], [(124.49606019388855, 42.068134726411465), (124.51636800113371, 42.04870645581869)], [(124.52765996410076, 42.066261345527614), (124.51322310995938, 42.0540385815381)], [(124.51649479977301, 42.083780279984325), (124.52465206539082, 42.10304479112108)], [(124.50491667037669, 42.050083608289), (124.49122552209263, 42.05859648967021)], [(124.52536470952593, 42.04458417234342), (124.53670678799335, 42.030349953746835)], [(124.51439209953578, 42.04240725947916), (124.49103053746023, 42.02320064834136)], [(124.52763538139972, 42.0393630839648), (124.50964732715347, 42.02942319796218)], [(124.53760670100203, 42.04829635764337), (124.52607207591986, 42.023302425964786)], [(124.49511959258898, 42.08062338301098), (124.47413781744508, 42.103531891015045)], [(124.53129439531874, 42.071537183764015), (124.52343864755436, 42.06947955111091)], [(124.5372121157035, 42.08508827512067), (124.56176453719127, 42.08062035511859)], [(124.53663595931222, 42.082437340530625), (124.51257993424701, 42.07236891644276)], [(124.5253090560068, 42.038977855693425), (124.52286221218347, 42.06229239988213)], [(124.49680170342164, 42.04375866695351), (124.50099109342625, 42.0255000014774)], [(124.5334575760381, 42.076403911112294), (124.53731571939261, 42.056213581317756)], [(124.5179595472126, 42.07349142415657), (124.53144842873388, 42.06174795941588)], [(124.49944256525548, 42.083018112939214), (124.50055722428104, 42.060672385902144)], [(124.49797766414426, 42.0591799570033), (124.50685306447129, 42.05641000866705)], [(124.51860125447598, 42.03889102332394), (124.52603736693148, 42.02349016596573)], [(124.49347842509827, 42.07220203193132), (124.48354169391322, 42.08259504689269)], [(124.49770735397371, 42.06584202349276), (124.48036213984076, 42.07634895914037)], [(124.52863329461294, 42.03789088139764), (124.52932208131391, 42.037709789859875)], [(124.5118173724469, 42.05107385115182), (124.52935469025, 42.04667894545307)], [(124.49482192894459, 42.08047870754823), (124.50538718736729, 42.08581707599969)], [(124.49475712982748, 42.06079507430483), (124.48881921675212, 42.06455650059843)], [(124.51958640882164, 42.0489455059176), (124.53080593136913, 42.03716094777987)], [(124.50387025963099, 42.043572286720476), (124.51802897178534, 42.030848152012055)], [(124.5130962607024, 42.06008910625879), (124.50415299276612, 42.046976328183014)] + CALL_459@GraphGeneration.gov + CALL_459 + + + CALR + [(174.4567735413034, 54.274112457475354), (174.47785070010931, 54.25554843471346)], [(174.45409857859076, 54.26477370868535), (174.4484106403143, 54.25022038242897)], [(174.46540093384897, 54.247237902478), (174.44226318065355, 54.24683800448953)], [(174.4381086480643, 54.29261429678802), (174.42046472708188, 54.29847397639615)], [(174.44603538643017, 54.28137372190661), (174.46710722571189, 54.287119843818566)], [(174.45788831604995, 54.250607996962295), (174.47939766716033, 54.27039597748568)], [(174.4548575531646, 54.258798723986864), (174.46772404583004, 54.258915708331465)], [(174.46868279384037, 54.26289256874118), (174.47833897582044, 54.24380401459525)], [(174.4510865950233, 54.25250227284954), (174.44765149896477, 54.22994855591494)], [(174.44113926810186, 54.28695891347293), (174.4474067269478, 54.27501754291717)], [(174.44374867970186, 54.280426829929674), (174.45515769747743, 54.29282536763015)], [(174.44208085192798, 54.246421967125514), (174.42110515229743, 54.23681578063472)], [(174.46384493108013, 54.288247124844375), (174.46064912813492, 54.28557084885546)], [(174.46945852426418, 54.25974179066111), (174.47950298732565, 54.28052740202905)], [(174.43297143842736, 54.262352203643076), (174.43737957236502, 54.257314973705945)], [(174.47163085736733, 54.27075991731782), (174.4499859886377, 54.251975041811555)], [(174.43670163146777, 54.26160947849414), (174.44083470230245, 54.24060984680922)], [(174.4281348839364, 54.27219054644021), (174.4381086504494, 54.281446915922494)], [(174.43652570933037, 54.27591891626516), (174.41398620833633, 54.2842539151489)], [(174.45255878115955, 54.274378182713974), (174.46080026662483, 54.273327946843416)], [(174.4421572974693, 54.28121458716215), (174.43787265306287, 54.272787822953866)], [(174.44066146832398, 54.256144000962465), (174.42641742057057, 54.24473491639072)], [(174.42408081874086, 54.25667057660048), (174.44450987748905, 54.25874084493087)], [(174.441104524938, 54.25931641524202), (174.43545285951706, 54.275752463220044)], [(174.46428918576316, 54.270471415024616), (174.44685892105787, 54.264918570339155)], [(174.4357738857279, 54.25284883078961), (174.42120103671192, 54.24269824135535)], [(174.46060054142978, 54.259509618170135), (174.4846490608211, 54.267432214936775)], [(174.46219551325106, 54.28343949911379), (174.4568182399087, 54.291270612587596)], [(174.4334105088445, 54.28875244424124), (174.43158206149712, 54.301022839132465)], [(174.4370229123145, 54.287559220407026), (174.42807582146062, 54.28567061839737)], [(174.43414243222742, 54.25803606718942), (174.42398470627367, 54.27126485890577)], [(174.4227461302536, 54.24770232437481), (174.44139184573592, 54.255545031285145)], [(174.4630474569057, 54.28495141766739), (174.45749650868464, 54.304301849502885)], [(174.42952813012135, 54.27793927369443), (174.42378135517612, 54.26284579448217)], [(174.45884155994466, 54.25258782108013), (174.4428056736382, 54.2458665127843)], [(174.4446423985016, 54.257360032667535), (174.42458132207884, 54.256965042528805)], [(174.43122708013803, 54.29270918515168), (174.4412682888813, 54.309676147383655)], [(174.4377824513285, 54.29035275457279), (174.4370683871915, 54.28630682543084)], [(174.45433262791943, 54.276162688858015), (174.4776085537817, 54.28491023948506)], [(174.43691411772596, 54.2755341713441), (174.4381488768272, 54.26635008682084)], [(174.44283864546543, 54.27124564249231), (174.43197543654654, 54.26701478417546)], [(174.43651843680033, 54.26766401007526), (174.43197279301074, 54.288763400041674)], [(174.46398909439455, 54.252984344968695), (174.44036694710633, 54.277794909124964)], [(174.45647030099676, 54.270901619914056), (174.44364992889743, 54.27471434507354)], [(174.4559834940466, 54.26546661962926), (174.45979770249758, 54.27305499420365)], [(174.42826129428113, 54.270335063317), (174.42125049777707, 54.28397597530483)], [(174.46092839952203, 54.27891855096083), (174.44763040029096, 54.26874609214373)], [(174.44577826220115, 54.25586413719986), (174.4427045552764, 54.248653618110986)], [(174.4422835067076, 54.278471602787086), (174.44474779229836, 54.27067647091475)], [(174.44451566807172, 54.26171570597695), (174.44358076217222, 54.24164288381219)] + CALL_551@GraphGeneration.gov + CALL_551 + + + CALR + [(4.853223252132057, 79.11795331070952), (4.856242322121045, 79.12375130136884)], [(4.88030252368801, 79.07971534915967), (4.872745652413013, 79.08218890152502)], [(4.852253992717737, 79.09128595851315), (4.85732341797531, 79.10657427807901)], [(4.857199495740483, 79.07359817442631), (4.851675701715662, 79.0877080453865)], [(4.859119896910402, 79.1113916703144), (4.849107547411364, 79.11701101896176)], [(4.88295306116602, 79.1093473767956), (4.9004434679796764, 79.11186656989446)], [(4.895496610869434, 79.09598243098108), (4.870609157449964, 79.07871907809246)], [(4.888746577528391, 79.08064307258185), (4.883442799210801, 79.0669831682764)], [(4.8705433287276545, 79.07617926825922), (4.8804638545172985, 79.05537377025931)], [(4.8743807791490905, 79.0967326343975), (4.865404847622412, 79.1082064491411)], [(4.897438049233262, 79.07429508296318), (4.877392191954624, 79.06244418119066)], [(4.866762629045513, 79.09370567813484), (4.8656291142626085, 79.10252178770119)], [(4.895185180295999, 79.0879118140684), (4.8707861848748575, 79.0980750887419)], [(4.866082268713711, 79.10714335719967), (4.866421954633291, 79.08951020432207)], [(4.879211942646426, 79.11690545459588), (4.859648616017665, 79.09882093625798)], [(4.851720291386951, 79.07343095374655), (4.857118472549581, 79.06436200384373)], [(4.858689862855605, 79.08193576883478), (4.850599071727597, 79.08633203099403)], [(4.883334677410399, 79.10726080864536), (4.86502222265436, 79.11114758134727)], [(4.85230956639275, 79.07707661021729), (4.85090914199783, 79.07682739862213)], [(4.889196429843278, 79.09104093092759), (4.878157693366937, 79.10795875192922)], [(4.867662398962214, 79.09787358968242), (4.863075321163318, 79.11615226606142)], [(4.86845483562353, 79.11266214556572), (4.8791641054055015, 79.12231222288729)], [(4.869137979581447, 79.0959958190467), (4.85549374355211, 79.07567942632264)], [(4.885500612591844, 79.10384702689751), (4.88705245130789, 79.09855702828304)], [(4.871099035176493, 79.07347517925923), (4.877245291811854, 79.07253519481705)], [(4.899449517696398, 79.08192636540466), (4.887661745074179, 79.08314089430087)], [(4.879085609730132, 79.07936849745577), (4.871398410486065, 79.05757803737104)], [(4.872170380503046, 79.0820121622043), (4.855573323133909, 79.06922650064544)], [(4.894173770570568, 79.1119408354383), (4.907985580128089, 79.1362436885335)], [(4.882217844142108, 79.09222377091719), (4.873103161517373, 79.0712587190597)], [(4.85774339336028, 79.10260983554973), (4.8550632873409105, 79.11317880416517)], [(4.866544073520899, 79.09949951309983), (4.88446758154535, 79.09391025106999)], [(4.881291972960423, 79.07373848516895), (4.86166901375101, 79.09085507537894)], [(4.853948866740883, 79.11946869011764), (4.839721060250755, 79.09850277748899)], [(4.869973895500317, 79.09884058597743), (4.870018632458229, 79.09816495786934)], [(4.887989995416144, 79.11884440092656), (4.903309888534692, 79.13931634105444)], [(4.8543602623809115, 79.11607386614564), (4.829874364409566, 79.11126114161664)], [(4.868980662168435, 79.07311811435767), (4.855672615632869, 79.08840835315496)], [(4.901046487737085, 79.10035022075658), (4.910106682863485, 79.08673798406817)], [(4.885782886895641, 79.11128948191462), (4.907176517180586, 79.13377924065757)], [(4.877111654895226, 79.08322983408381), (4.8819966416791845, 79.0707580597406)], [(4.865439655139955, 79.10857940734738), (4.843140938835137, 79.12690647962874)], [(4.851963054864562, 79.10202833839503), (4.838904814286317, 79.08168244543876)], [(4.886117947793754, 79.11405434741394), (4.873615490513426, 79.11203785175809)], [(4.864797151866785, 79.1163749410419), (4.8701892109707945, 79.13639262338765)], [(4.8743110258096305, 79.09749480505778), (4.881793286125878, 79.09991351460484)], [(4.897401015070974, 79.08631717888919), (4.89928960353782, 79.08941056615465)], [(4.881920895630835, 79.11955697195857), (4.899378273864393, 79.14314266053093)], [(4.90020952852469, 79.08985241593331), (4.893874255063181, 79.08976813499287)], [(4.86084758990378, 79.11814544806268), (4.879401681535536, 79.12686601535418)] + CALL_643@GraphGeneration.gov + CALL_643 + + + CALR + [(82.52361102919592, 83.10389280140221), (82.516411985999, 83.09578849220738)], [(82.53754216501342, 83.11661199892129), (82.5611586402167, 83.12983649990558)], [(82.52492415527206, 83.10050092750402), (82.54886704667821, 83.07837505637764)], [(82.53986385939002, 83.12856807971131), (82.56132148372426, 83.13303693362487)], [(82.5077400878703, 83.09781162979593), (82.50739872076421, 83.11770495552398)], [(82.5245612411131, 83.08882466495034), (82.53945077428983, 83.10639060285723)], [(82.49635268357086, 83.13123374643428), (82.47449652576677, 83.12782859522264)], [(82.537518338644, 83.09803094886468), (82.52964380012995, 83.1082349227136)], [(82.51254680010815, 83.10503314795059), (82.53620622186101, 83.08130488414908)], [(82.50067836098503, 83.1301713293719), (82.52395297145895, 83.1157949127999)], [(82.53811723814113, 83.11678748657644), (82.52033907626786, 83.13886997373163)], [(82.50145885256254, 83.12690494143234), (82.51426259496287, 83.1102456717486)], [(82.53080816740727, 83.12230264899583), (82.51428464764096, 83.12971169586633)], [(82.53085541575228, 83.11140731310988), (82.54909145715601, 83.0925107885756)], [(82.52923464773669, 83.09453049432271), (82.50914191535254, 83.07813153183818)], [(82.49679534696747, 83.09018849259259), (82.50995377731202, 83.1141288494043)], [(82.50341979884053, 83.1197003347103), (82.4886509639344, 83.1397195065083)], [(82.50391585852547, 83.12615520159528), (82.48466030218452, 83.11987409020175)], [(82.54237713076556, 83.12754090730765), (82.53269217008966, 83.11932533185318)], [(82.50629469117395, 83.13233323209761), (82.51015568934848, 83.10781035899609)], [(82.51442215012474, 83.1258786804849), (82.49518890139056, 83.11258973545462)], [(82.50664436412791, 83.10220697469937), (82.52615481679098, 83.08589104935137)], [(82.52128849430201, 83.11462809156781), (82.5361797511441, 83.13781652772978)], [(82.50824980054641, 83.09924975050806), (82.5137853546769, 83.11590846067328)], [(82.53912135252979, 83.12060315860973), (82.51860818216343, 83.10181976801171)], [(82.52514253064321, 83.09787802449704), (82.50628875443276, 83.100844739804)], [(82.5224444419358, 83.11599827757861), (82.54529608282101, 83.12111362254872)], [(82.49921163175591, 83.11717074967656), (82.50777397416351, 83.09390899497866)], [(82.53656558778889, 83.13159172712784), (82.54298687661283, 83.11121414979861)], [(82.50843456677232, 83.09896710625114), (82.50169952618313, 83.10414671688906)], [(82.52359142208972, 83.12057710734246), (82.51320808123715, 83.13598802800567)], [(82.52926858908, 83.12533124156937), (82.53211861347768, 83.14676749175044)], [(82.53773175978502, 83.12206588098272), (82.51446080119835, 83.12686500705573)], [(82.53207765694457, 83.12204702254347), (82.55517629471161, 83.13066123634064)], [(82.50755614758636, 83.1160191553925), (82.49039945854928, 83.14015846839833)], [(82.54184073454451, 83.09708228775848), (82.52143444781788, 83.10125204098317)], [(82.53371922817036, 83.11794417383523), (82.52518264047643, 83.09515616363373)], [(82.49356933672037, 83.1335481924971), (82.48435261272924, 83.13570594808743)], [(82.50295367073032, 83.11100382877818), (82.52081184507648, 83.1131762394587)], [(82.49415243708515, 83.11405426873647), (82.47757072311822, 83.12934405658864)], [(82.51932747968725, 83.10713941747717), (82.52077877860039, 83.13179070422126)], [(82.53969051886058, 83.11411104829968), (82.56340893935838, 83.12742282148726)], [(82.49759734398901, 83.11188239449838), (82.50749597819447, 83.09289074568439)], [(82.50804630900926, 83.12858677415568), (82.52980115264896, 83.11803659887718)], [(82.50258880027876, 83.09865040453889), (82.50245015330124, 83.10868884635858)], [(82.53339621741938, 83.10269870695275), (82.53410255046683, 83.11968826992693)], [(82.49666987806101, 83.08730351226), (82.49722293724817, 83.0961045669241)], [(82.5132063739125, 83.11960360948073), (82.50976616917293, 83.11585395500873)], [(82.51760549620566, 83.09457926578492), (82.50555310641579, 83.08020872380415)], [(82.51408241791191, 83.0991198129039), (82.49469730264602, 83.09428306200658)] + CALL_735@GraphGeneration.gov + CALL_735 + + + CALR + [(192.08546569879817, 78.60510511221189), (192.07123371013847, 78.60000716422012)], [(192.09610139735537, 78.61610733603709), (192.09469836095764, 78.61896162470379)], [(192.09762985767853, 78.6315900642175), (192.09431577517466, 78.62946286263576)], [(192.10260031493814, 78.60650111046795), (192.11359321330875, 78.61358862567971)], [(192.0899820600547, 78.63184629994575), (192.07273198906233, 78.65607538882793)], [(192.08937358488382, 78.62092389399564), (192.09889116439118, 78.64055593719887)], [(192.07870156747452, 78.61420383845797), (192.08916881178197, 78.63131827327105)], [(192.07488441904388, 78.590075132047), (192.05037106051574, 78.57329137099975)], [(192.0763572001301, 78.60695104414583), (192.05324338706203, 78.60035847703497)], [(192.11072319780132, 78.63079988687244), (192.11677210514253, 78.62952116668949)], [(192.08817155172747, 78.61787918386764), (192.06766784946413, 78.61947882529623)], [(192.07276824389763, 78.6319614503797), (192.0613378744377, 78.63453899852198)], [(192.10381580364853, 78.60898996675208), (192.09626124479811, 78.61031116528868)], [(192.10395450472373, 78.62153408919077), (192.0909349619146, 78.63492675541772)], [(192.10476946444203, 78.59450691766287), (192.11366378574803, 78.61556131568048)], [(192.09593235174856, 78.59237628715313), (192.10841700174646, 78.61621416611935)], [(192.10990088711512, 78.60174042242612), (192.09870663915476, 78.59768023225621)], [(192.1071558568998, 78.6213053138899), (192.13097743679404, 78.6082836866832)], [(192.1015374175552, 78.63012857518507), (192.1164617632354, 78.62796361466944)], [(192.1079201052246, 78.5884915690817), (192.10345667401432, 78.56621551659877)], [(192.10452656936093, 78.61140197434196), (192.08739783267416, 78.62948518506664)], [(192.06856754078493, 78.6235102055557), (192.04688623938793, 78.6183396908248)], [(192.09765270124848, 78.62871420545068), (192.10093567806558, 78.6341861987199)], [(192.079644333334, 78.6016859825485), (192.10332486174607, 78.60506360374917)], [(192.06954400629886, 78.60176566683842), (192.0702369032973, 78.62391690898151)], [(192.08597759819773, 78.6074544912121), (192.07681841649466, 78.61556865677724)], [(192.0880598706291, 78.58704322266428), (192.0887911406485, 78.56500887607939)], [(192.08090600391714, 78.63084980439652), (192.0815087642584, 78.61397242394975)], [(192.07831235265326, 78.60775521984095), (192.06607884393551, 78.62279666429993)], [(192.098984861149, 78.62741606500741), (192.11386551002875, 78.60259987965996)], [(192.0951094265325, 78.60193886348812), (192.07782774273545, 78.62453047837681)], [(192.06634197979793, 78.60108484149406), (192.05126442876139, 78.59062939827832)], [(192.10405681294043, 78.61238567580047), (192.12332983635292, 78.63132611007879)], [(192.06849797905747, 78.60021624222787), (192.08952968552103, 78.58993104970747)], [(192.1078632458154, 78.58619075183155), (192.1273086527267, 78.5891875517945)], [(192.0999090533286, 78.63133689496476), (192.0992425915629, 78.60651564580004)], [(192.07629981790834, 78.61346968476278), (192.10028721245507, 78.63459723814199)], [(192.09501995991673, 78.6131289768706), (192.08835366618445, 78.61563541779829)], [(192.0831460274353, 78.61875496062797), (192.05885270482807, 78.60879130351795)], [(192.08745749061538, 78.58739158047455), (192.11069454718395, 78.60537909569707)], [(192.10552685297276, 78.58775874230405), (192.12353500593272, 78.5827082997049)], [(192.0942336662811, 78.62823461649927), (192.08748872644696, 78.61632364901341)], [(192.08879191444663, 78.60020745202324), (192.10008136826474, 78.59568197200346)], [(192.0824983615426, 78.62328779046676), (192.10386540764247, 78.6082705886804)], [(192.1140613603528, 78.59884900479551), (192.09301135797185, 78.59831571729508)], [(192.06520294786034, 78.59569284608699), (192.0468921048811, 78.60310506535959)], [(192.0949494101089, 78.59615956918184), (192.10396007393643, 78.59226450036398)], [(192.076218693648, 78.62280109459299), (192.08611325529787, 78.60489040316567)], [(192.11004756845244, 78.58676344364433), (192.1055013132556, 78.57985795594708)], [(192.06612782823439, 78.63223563657756), (192.08128580121084, 78.60986644688674)] + CALL_827@GraphGeneration.gov + CALL_827 + + + CALR + [(20.21939982775638, 91.39141797573832), (20.23150814486353, 91.38750134465754)], [(20.21576887793793, 91.36767399653544), (20.21176880660616, 91.36773584682392)], [(20.244260858742507, 91.36051944952044), (20.25400804231537, 91.35787017928044)], [(20.217403937081034, 91.35208400767499), (20.238692811143558, 91.3442375481992)], [(20.258929590159, 91.38663590469024), (20.244400787141537, 91.38784359963238)], [(20.215734591773614, 91.38189665431798), (20.22031641333457, 91.37366882292463)], [(20.225763388463395, 91.358593350031), (20.239384069500368, 91.33465726520865)], [(20.248751373539314, 91.37850453713789), (20.2595676649505, 91.39365873065621)], [(20.22298972574979, 91.36925554814489), (20.24323749992182, 91.36634835980581)], [(20.216211487675864, 91.35772478980276), (20.195276785035023, 91.3577893040174)], [(20.21595554123877, 91.36942305337813), (20.20918240611153, 91.35807991514525)], [(20.24832469128817, 91.37005609731251), (20.267210764127306, 91.36191694080999)], [(20.24586380585014, 91.35658272095262), (20.257271969053413, 91.36016201988113)], [(20.233071183905363, 91.35670493718699), (20.211838850553118, 91.33443079724893)], [(20.217807115975297, 91.35821237660844), (20.19701055402714, 91.35708376890385)], [(20.238756713646154, 91.38344309775616), (20.226743719180924, 91.36692543869181)], [(20.256535462204624, 91.37615617506007), (20.263499750901254, 91.40006511817218)], [(20.228659989080906, 91.37875035721827), (20.23992417609416, 91.3976169130713)], [(20.230013901105416, 91.36320089306409), (20.21279337647675, 91.36347639680102)], [(20.253745086895364, 91.35962571674276), (20.228792763824483, 91.3536942682094)], [(20.258098945357002, 91.37041959238337), (20.264186318475723, 91.39013724278766)], [(20.24322729943394, 91.36679729796188), (20.221923853060723, 91.35513794548172)], [(20.250668519427805, 91.35430951594087), (20.22985106092675, 91.33722753157541)], [(20.258552348424608, 91.385787049407), (20.262574557701694, 91.39917726320121)], [(20.21925994895597, 91.39625591415476), (20.202335301333605, 91.41522305988148)], [(20.24229467664211, 91.37017919787397), (20.238436745152768, 91.3843103433066)], [(20.249845596659373, 91.3733872083857), (20.2312772683764, 91.36104017594141)], [(20.248014889734343, 91.37557625814009), (20.254122881554647, 91.37361962436435)], [(20.239828627645164, 91.35784582091277), (20.264311043708247, 91.35878461020853)], [(20.24580536718601, 91.39634985501411), (20.236558141861824, 91.41345945380232)], [(20.225156997626197, 91.35967284354042), (20.248167904153224, 91.33967806741524)], [(20.231331774948924, 91.36258797972904), (20.21961644771753, 91.37464598566622)], [(20.215304054956576, 91.37183961312022), (20.207789997687176, 91.36317037157261)], [(20.235030121037383, 91.38636088457035), (20.21983124855028, 91.36326415670302)], [(20.238561405776373, 91.37736600926218), (20.21959435894292, 91.35347878734703)], [(20.222663868205355, 91.39169704935185), (20.22065331634129, 91.39995020425224)], [(20.238998521830208, 91.3591356557116), (20.24740264088347, 91.35170289189846)], [(20.2516926721801, 91.35862823964085), (20.237290869526802, 91.34474340667936)], [(20.25993954017645, 91.35551714933868), (20.246261764970704, 91.34180943573267)], [(20.236074284964324, 91.35174530980368), (20.22080916966155, 91.37672019581919)], [(20.237550171805463, 91.39248996384758), (20.238721144426904, 91.37501849527509)], [(20.227994112127995, 91.39250666917978), (20.243377619442402, 91.39912672410333)], [(20.246852248857877, 91.37492479255513), (20.23532092118981, 91.35630067714408)], [(20.246088307715755, 91.38962010145242), (20.224941838659973, 91.39304042650919)], [(20.244780055048956, 91.38739895168618), (20.225826032880263, 91.39664871920526)], [(20.220394866430336, 91.3826813462492), (20.201516463930524, 91.37854360528493)], [(20.232066599824226, 91.3566184717213), (20.212029395995803, 91.3498710422738)], [(20.21791083669612, 91.3724936207127), (20.22297917020732, 91.37666919856925)], [(20.244166265640025, 91.38385603938738), (20.220763800368786, 91.36294446335161)], [(20.235805337664235, 91.38618800932932), (20.244123810646105, 91.39483206142393)] + CALL_919@GraphGeneration.gov + CALL_919 + + + CALR + [(82.64418134106678, 113.13206332585324), (82.62425735532699, 113.13570195443883)], [(82.65133861835676, 113.12916562816423), (82.64384634676554, 113.14856572726822)], [(82.65488220016009, 113.14312752345793), (82.64509594799095, 113.13265815910196)], [(82.66001626395983, 113.1371203606457), (82.65218710966798, 113.12106193242244)], [(82.66677175746815, 113.1270015962191), (82.67320691120172, 113.11364781225072)], [(82.64457207510584, 113.13528085888161), (82.61996240226449, 113.12386031949666)], [(82.64946868561091, 113.15472660246833), (82.6708308771591, 113.1592721620022)], [(82.66265394973605, 113.11831910276555), (82.65289327350102, 113.10057456811474)], [(82.6314952834203, 113.12676236476683), (82.64300587193765, 113.11612939958684)], [(82.66416241792446, 113.15734590087136), (82.64376770491211, 113.15391471417055)], [(82.67944496196704, 113.12054837322333), (82.67300993651581, 113.1084312482038)], [(82.64120291668384, 113.13938230862385), (82.64486999493793, 113.12175689080502)], [(82.66598656017274, 113.1175451329631), (82.66396375516987, 113.10890643303144)], [(82.67522431588526, 113.12529447985065), (82.6876503833671, 113.1119872245896)], [(82.66773558832273, 113.15236090301894), (82.64623713127233, 113.16857553301243)], [(82.65454105076086, 113.12522625406811), (82.65357711367011, 113.14609298286184)], [(82.67319399002005, 113.1586514451317), (82.67478668658339, 113.16970681108752)], [(82.65254355552044, 113.14611815365205), (82.67476254700615, 113.16067646090983)], [(82.65158994196224, 113.11715741863893), (82.63626783305541, 113.1107241895498)], [(82.66938471303372, 113.15673831113011), (82.68295792464355, 113.1511396647529)], [(82.63138316526356, 113.13298041571548), (82.62350664672243, 113.1220171121205)], [(82.65518525122604, 113.14533101949874), (82.65973497565685, 113.1439066896416)], [(82.6757743733462, 113.13463335644123), (82.6628361763466, 113.13388464677678)], [(82.66811858872215, 113.15538051373278), (82.6822904461249, 113.15541563623538)], [(82.67538312313472, 113.12646466056191), (82.65703907710356, 113.12113296017469)], [(82.6391476267401, 113.12539630513544), (82.65121253716737, 113.11608869338356)], [(82.64540167865533, 113.11713670460342), (82.63085434064972, 113.11058947063722)], [(82.6358235803336, 113.13959818306434), (82.64588140434634, 113.11694915167524)], [(82.6502291298092, 113.13555832905475), (82.6602181847698, 113.1107176826912)], [(82.6615913878421, 113.15786841804207), (82.64731115710102, 113.17736899464516)], [(82.63958752497132, 113.12298119729618), (82.62530657386708, 113.13764797268341)], [(82.63057739504394, 113.11308425063692), (82.6507142715913, 113.13049487336022)], [(82.64166808073752, 113.14047226359587), (82.64971147457257, 113.13891863265648)], [(82.65759843232266, 113.1334388604072), (82.64949323648626, 113.12619958506899)], [(82.65538856515026, 113.13896050937262), (82.67351286704243, 113.1426929882265)], [(82.63382659940885, 113.15487620122758), (82.65253974216279, 113.17515139389114)], [(82.63243048080082, 113.1527048196905), (82.61437162363326, 113.12983661854724)], [(82.6394097488181, 113.1554067811811), (82.62528818445865, 113.13099788079644)], [(82.63346818935041, 113.11411937184603), (82.65264524397124, 113.09140128069416)], [(82.67930229175506, 113.1228737905899), (82.66092204711504, 113.13324372651066)], [(82.64676147298142, 113.14590967011395), (82.66275645356856, 113.13855130313584)], [(82.64181776790407, 113.12000287949289), (82.62019357969885, 113.09524720667248)], [(82.66303203779346, 113.146850469287), (82.65651709985332, 113.14616552822262)], [(82.63385565371395, 113.14250246486553), (82.6401901394979, 113.13858840230594)], [(82.64608333337787, 113.12462585035118), (82.63963391807977, 113.11934593216138)], [(82.65302111432779, 113.1374037644042), (82.64931624215819, 113.12280156670327)], [(82.66035812574717, 113.11318561707084), (82.66337699167589, 113.12391918540789)], [(82.67112435874539, 113.14118703872226), (82.66710242536173, 113.11812187500455)], [(82.64950494424241, 113.12040439687382), (82.63080277406156, 113.1031905262493)], [(82.66977452053793, 113.12762824348648), (82.69109562731926, 113.12716442939882)] + CALL_1011@GraphGeneration.gov + CALL_1011 + + + CALR + [(193.34626298554167, 102.27696147845971), (193.3506165573307, 102.28436838386088)], [(193.3415185884503, 102.2713620254902), (193.34983688394635, 102.28835200490131)], [(193.32485374120725, 102.291494985708), (193.3049678659528, 102.29697767206343)], [(193.3619483152898, 102.27894399986967), (193.35661250078513, 102.2697599215791)], [(193.31958263226622, 102.29792827390139), (193.3008411050449, 102.28943307258776)], [(193.36534085603392, 102.29532146576888), (193.37947302134478, 102.2746224857203)], [(193.32010778593914, 102.30304724053995), (193.33240657552224, 102.2887989144404)], [(193.34875224441444, 102.29932106172811), (193.35838540214792, 102.30790894464977)], [(193.35610702283148, 102.27485289057694), (193.37329019836628, 102.26356876751395)], [(193.35766233628314, 102.30599930135642), (193.37269331384084, 102.30533136902129)], [(193.35487884781745, 102.27567163349126), (193.3487752403035, 102.29961541744716)], [(193.35128325129995, 102.29497255213626), (193.34765552530612, 102.31666994267619)], [(193.35869242135269, 102.3132327671399), (193.34930565367438, 102.28954537418853)], [(193.33101622594975, 102.27566374535915), (193.30604655070942, 102.26664996904162)], [(193.3399769666774, 102.28519511426134), (193.34195925509593, 102.29052658574238)], [(193.32423973116553, 102.29769606667962), (193.34782028053806, 102.29501653806172)], [(193.31818705519896, 102.31124321645238), (193.30702089466976, 102.28670950779401)], [(193.35391195969086, 102.27960512238951), (193.36557172117793, 102.28609838116367)], [(193.318740110107, 102.30861101002684), (193.29665010648768, 102.3280408839998)], [(193.36260015506073, 102.29528123920822), (193.34722759268337, 102.28131841747073)], [(193.3187242382402, 102.2896990502145), (193.34192071905153, 102.27870186619381)], [(193.35539586520028, 102.30831439128369), (193.36748414296562, 102.31197219568534)], [(193.32675179134426, 102.29412397023589), (193.33959571334088, 102.3123079523544)], [(193.36383281501122, 102.27648508304192), (193.3643491655515, 102.25940817529849)], [(193.32603378166877, 102.31504771927275), (193.32870015823033, 102.31483141730241)], [(193.36065976914213, 102.29645593487652), (193.3811602295356, 102.30909494069336)], [(193.3561002112274, 102.28953113992019), (193.34050466694876, 102.29861313361859)], [(193.33137944995687, 102.29129861059921), (193.35006257239442, 102.27820483498029)], [(193.35228014178819, 102.31987289263807), (193.3539647703318, 102.31067594330635)], [(193.36197991376102, 102.31038107375862), (193.38127121661213, 102.31171548475385)], [(193.3197163893859, 102.28668445117293), (193.3338755567143, 102.30228402280594)], [(193.3190543104732, 102.286501992188), (193.30482018331347, 102.29199692367375)], [(193.35431417630394, 102.29812460520446), (193.365088576887, 102.27636171295028)], [(193.32215208872086, 102.29677111280502), (193.32763930030313, 102.32075280153974)], [(193.3561825734436, 102.29724305544767), (193.37125863193546, 102.30056587755517)], [(193.32964538337046, 102.2775335024697), (193.31288466900244, 102.26315158759878)], [(193.3580647374825, 102.27806537979396), (193.3672364031838, 102.2963219299004)], [(193.35926874178816, 102.31097753676275), (193.3608514194517, 102.30805339437717)], [(193.3192195107217, 102.31641750827914), (193.34015005359845, 102.3329146749252)], [(193.33096072022448, 102.27417116807254), (193.32669202703818, 102.28610231076335)], [(193.31694471943948, 102.30879936727462), (193.3273461015083, 102.29770820583539)], [(193.32860253027667, 102.27283834938042), (193.31402374571772, 102.28632657593772)], [(193.34711425656673, 102.2973994067249), (193.32703710653593, 102.31960210795341)], [(193.33883131365337, 102.32001413722183), (193.35475151387593, 102.30877798920477)], [(193.34558479077816, 102.3021087953263), (193.32792796523478, 102.30191175969154)], [(193.34557155998064, 102.32020461930475), (193.34708869795605, 102.29770164415457)], [(193.32723610518602, 102.31328431264068), (193.3074191933992, 102.3280931268774)], [(193.34301752182213, 102.31737343837808), (193.35845088398375, 102.29823766956045)], [(193.33257876320343, 102.31083776296386), (193.31062511719466, 102.29638807571406)], [(193.32831358665425, 102.27819264691152), (193.3068774480775, 102.29372209188266)] + CALL_1103@GraphGeneration.gov + CALL_1103 + + + CALR + [(0.7324907664218324, 139.2583942272766), (0.7134738343143134, 139.2833350059802)], [(0.7671775491930368, 139.24377902671463), (0.7869780326878775, 139.25575423853084)], [(0.7324705629890134, 139.23273630426925), (0.7490224385279208, 139.255363854424)], [(0.7652804948747125, 139.26912667734928), (0.7510308628380669, 139.25135177680207)], [(0.7745259546055573, 139.26374526446625), (0.7882828528363669, 139.26312614867723)], [(0.7547289189538, 139.26317790429363), (0.7364053412480835, 139.24138135986286)], [(0.7723944454660583, 139.27800674265316), (0.7541320788306667, 139.2781139108078)], [(0.7276182926919902, 139.26939015202183), (0.7508726032461857, 139.25107219846836)], [(0.7275155690738495, 139.2435926045723), (0.7183262815989387, 139.26130083565536)], [(0.7407567375484813, 139.26818535145924), (0.7196136342097391, 139.2776349229235)], [(0.7575796664588562, 139.232401189968), (0.7498314580056261, 139.24067315291038)], [(0.7467320822099476, 139.2429650466579), (0.7459931986323393, 139.23780229839426)], [(0.733690129737558, 139.26790380218907), (0.7261493658620821, 139.2912719334829)], [(0.7515303492889918, 139.2413476024279), (0.7691189798743828, 139.24672012771782)], [(0.7622906414838104, 139.23267407091035), (0.7777317230808715, 139.24930727429356)], [(0.7327614276129318, 139.24706226446727), (0.7306596685935663, 139.24840043172784)], [(0.7696651629392278, 139.24912766506543), (0.746315800975011, 139.26487250869704)], [(0.7731373502634132, 139.2550832538014), (0.7550597944332926, 139.2434575188854)], [(0.7624454370652469, 139.23478541006858), (0.7789199341513771, 139.22186900147918)], [(0.7448723063050847, 139.2717740679163), (0.7317971156812768, 139.2914613079341)], [(0.7360473369790292, 139.23917542302064), (0.7503370031336914, 139.21602150238886)], [(0.7350932065058879, 139.2670337601436), (0.7283483835093678, 139.24291785945402)], [(0.771156971807563, 139.245314881996), (0.7765854930401842, 139.23782861973518)], [(0.7386681366017189, 139.23468569389522), (0.7179695238109911, 139.2379473117476)], [(0.7637249078151567, 139.2473727432281), (0.7462580044930661, 139.23362222482547)], [(0.7478238960418085, 139.23268665742842), (0.7411298320016352, 139.21117856409006)], [(0.7478441371670141, 139.23979325038658), (0.7267282755109148, 139.25543705289553)], [(0.7370404318375701, 139.27080279532), (0.7380833857505313, 139.28571744116732)], [(0.7603331245497111, 139.26258037457148), (0.7566513325423598, 139.2637085770383)], [(0.7413821791386754, 139.25960852502817), (0.7446321913364614, 139.2518214797215)], [(0.7664859513588327, 139.28017238118656), (0.7775102913688593, 139.288302411973)], [(0.7566707059980328, 139.24822003241295), (0.7594567490211244, 139.26812637880712)], [(0.734259445034514, 139.2616815440545), (0.7283850853572658, 139.2819532122258)], [(0.7543093354568241, 139.2681886530151), (0.7764470585320472, 139.25554974024544)], [(0.7251752975438889, 139.26948759114867), (0.7143788657903427, 139.2603387733996)], [(0.7625304714552, 139.2640948419842), (0.7494369124168672, 139.24434902689077)], [(0.7669091998100623, 139.24423257109356), (0.7625286547152279, 139.25802624620997)], [(0.7447030539344065, 139.26959659849723), (0.7505638698909897, 139.26908529452504)], [(0.7609262563824757, 139.280926363295), (0.7804856149710466, 139.27317292331267)], [(0.7621682558467469, 139.2330861671268), (0.7463244975809157, 139.2464259052237)], [(0.7455233028443202, 139.2453043848328), (0.7459083313913153, 139.24566143494985)], [(0.7256300603988367, 139.25635278233517), (0.743483932611509, 139.25109490117822)], [(0.758913843324082, 139.26212870462726), (0.748698041154107, 139.259891411311)], [(0.7528965916616215, 139.24016508422255), (0.7616536897951544, 139.26362592536148)], [(0.7492746059093998, 139.27742020807213), (0.7572918539663918, 139.293873170204)], [(0.7665406249492254, 139.2394384608378), (0.7901837216052044, 139.2222575707196)], [(0.7610153360054952, 139.23227728641356), (0.7577706825928554, 139.25489283184433)], [(0.7285318908172029, 139.2681030692371), (0.733475456559945, 139.29026842089502)], [(0.7496065934419713, 139.23543062136847), (0.748488806048652, 139.24967895985426)], [(0.7655402941999753, 139.2553396674378), (0.753427871035592, 139.24187645067082)] + CALL_1195@GraphGeneration.gov + CALL_1195 + + + CALR + [(112.0575172891964, 117.30390056090442), (112.0427324141244, 117.28171914380235)], [(112.07508417820883, 117.27920985704552), (112.08394359981828, 117.29858953575008)], [(112.09547336370296, 117.29931006126603), (112.08615399808318, 117.29553531798321)], [(112.07591679575685, 117.30112764172196), (112.07988109112362, 117.29207685883063)], [(112.06432030851879, 117.28856928295902), (112.07477488163597, 117.27263277172857)], [(112.094396561351, 117.30289665816426), (112.11905986826632, 117.31706860258319)], [(112.0855308958429, 117.31733696500451), (112.10786607795332, 117.31762225195064)], [(112.07861244057884, 117.28001391521585), (112.05583385450619, 117.29486842786943)], [(112.07074113371016, 117.30977898758668), (112.04727361834205, 117.31500509050959)], [(112.07888021439977, 117.29059870786894), (112.06045592912702, 117.29294661205368)], [(112.06479363790284, 117.3045181808679), (112.04879494231403, 117.3077929635474)], [(112.0800532106261, 117.27232440382825), (112.05543518224738, 117.27177587250873)], [(112.08841386279127, 117.27799200616136), (112.06638437089447, 117.29742887498378)], [(112.05778767966076, 117.29259741877519), (112.04329470791735, 117.29941967125008)], [(112.07672641916102, 117.29041910074828), (112.09641065014523, 117.31076216872198)], [(112.08728001633506, 117.29591696203768), (112.11187225931445, 117.29758016306562)], [(112.09864016172284, 117.31218608395908), (112.10955438334533, 117.28894719371623)], [(112.08313832702024, 117.27598681149985), (112.10124091514669, 117.27815089388577)], [(112.07092756002278, 117.30728852613333), (112.0690704240774, 117.31258116106139)], [(112.07045210036362, 117.30686449669183), (112.05505050145895, 117.3009140899639)], [(112.09657209192187, 117.3076223960985), (112.1105738415972, 117.28517203460413)], [(112.09165452306335, 117.27783579554017), (112.07099388263855, 117.28315988754683)], [(112.06323692108786, 117.30524487152125), (112.06205736771061, 117.29053917237827)], [(112.06709233906498, 117.282222819763), (112.07704794172673, 117.26409795393761)], [(112.05863744486653, 117.28349900874072), (112.04942161561145, 117.27197478735684)], [(112.09621173259966, 117.27909326142704), (112.11608150067592, 117.30095468096626)], [(112.10271622092958, 117.27128227715106), (112.08723896322712, 117.27451196823624)], [(112.07242607214471, 117.29509454125073), (112.09421929436526, 117.30007477627943)], [(112.08602727739901, 117.30734471902606), (112.08286857433099, 117.30542384816874)], [(112.06131925670576, 117.26997748580796), (112.04547130846684, 117.25459141942667)], [(112.06828517151811, 117.2692561831417), (112.09083596636475, 117.24849567016497)], [(112.09792041632141, 117.2682451320366), (112.07293618964164, 117.26572079774716)], [(112.07915212594357, 117.28493485070749), (112.09888533404761, 117.26494506930247)], [(112.05826434959931, 117.284541739495), (112.08276743960002, 117.28850921449893)], [(112.06030524377998, 117.30129012887276), (112.06179333761517, 117.28494801589012)], [(112.10283755463516, 117.27023090987552), (112.11886037533655, 117.24537035494832)], [(112.09128646475814, 117.31200954798287), (112.0863729245765, 117.32126937684312)], [(112.10362180332083, 117.29342466409923), (112.12593895763413, 117.2726406900314)], [(112.09683673747847, 117.30630111371384), (112.11610954160035, 117.2870824491037)], [(112.10194001330396, 117.30870575757508), (112.0905371064737, 117.31441581172392)], [(112.09473596788251, 117.29256696496763), (112.09967269440435, 117.27015580721236)], [(112.10037010145679, 117.28601134783851), (112.11780410664552, 117.27018557253683)], [(112.09763055010761, 117.29234126221301), (112.10200565937387, 117.27460237190121)], [(112.08082928842173, 117.28614203582428), (112.09872636129808, 117.28295122062748)], [(112.09070040536461, 117.3175554051807), (112.07180532797818, 117.31270110325423)], [(112.05758753861154, 117.28748688742134), (112.03904909424095, 117.27707672776586)], [(112.05687652867354, 117.31642601958397), (112.08051793715113, 117.31348767880212)], [(112.0586640019043, 117.29778568778222), (112.04052594319921, 117.28203535192314)], [(112.05902811747413, 117.28418319288329), (112.05193661734098, 117.28213364252834)], [(112.07498883565991, 117.2929554593039), (112.06846045294893, 117.31761448881726)] + CALL_1287@GraphGeneration.gov + CALL_1287 + + + CALR + [(178.6767548239067, 124.33664587304243), (178.66621577757186, 124.3135685917251)], [(178.6994773707021, 124.34669956843332), (178.7179358100699, 124.36971065982864)], [(178.70392122989543, 124.38274450151546), (178.7192556851807, 124.39316691423953)], [(178.71536413164222, 124.37833846006568), (178.73755148588435, 124.3638448937214)], [(178.71726241248624, 124.35359835677622), (178.70233220601955, 124.35644859965043)], [(178.6826747706655, 124.37117750788885), (178.68250035152326, 124.36054262497368)], [(178.70264474015363, 124.34488186240256), (178.68612550628836, 124.32863443010059)], [(178.68705553322073, 124.37164012936088), (178.66718796965537, 124.36498197346191)], [(178.70780916847423, 124.37985883231109), (178.73248651115858, 124.40110387227375)], [(178.7162262882757, 124.37710536583744), (178.7219890988848, 124.39203618983635)], [(178.71943863733847, 124.36882935826182), (178.70553734694883, 124.37775571651017)], [(178.69500178211842, 124.37331191852515), (178.6891707067012, 124.37034979074556)], [(178.690052014229, 124.34925763923705), (178.67961746859424, 124.32998394242641)], [(178.71569574715033, 124.37873655790875), (178.69723187675703, 124.37057798620637)], [(178.71154422119855, 124.36254582321439), (178.69876738481315, 124.38656662707444)], [(178.6832519083019, 124.3518370144818), (178.68186669114883, 124.33497832341358)], [(178.6828593458311, 124.36445439651163), (178.69177683562094, 124.36010953496475)], [(178.6941963618943, 124.3817135977459), (178.70755141328533, 124.39982381190251)], [(178.69474552848203, 124.3579195827542), (178.6866099012522, 124.33930814448793)], [(178.6919172125442, 124.34558105609328), (178.7118088430375, 124.33093514822735)], [(178.69039285555957, 124.34327545539287), (178.71438843149716, 124.33386933297041)], [(178.71130289276044, 124.37030456478446), (178.69373568137487, 124.36056319856282)], [(178.6912272629824, 124.37917145422418), (178.7017677291945, 124.40071127069642)], [(178.67587367698528, 124.38002287618875), (178.66203848876495, 124.38445706828787)], [(178.71949136176568, 124.37682343513352), (178.70423343851863, 124.36599932263924)], [(178.68181083793323, 124.37645992861387), (178.65769190035257, 124.36681401284109)], [(178.6937313775717, 124.37999403944042), (178.69985297367336, 124.37800090563937)], [(178.6991131599868, 124.36659092031897), (178.68684988964068, 124.35311313852655)], [(178.71290640790232, 124.34674124691499), (178.71213362708528, 124.3289826413)], [(178.7035997148054, 124.34319724954081), (178.68725236392635, 124.33974350475825)], [(178.70379566426547, 124.37782176665486), (178.72066192927645, 124.36058602960128)], [(178.70471163134465, 124.37907868082016), (178.68059649513444, 124.37210851658536)], [(178.69793392271404, 124.35753648413053), (178.68020318727628, 124.34016820144124)], [(178.70983896646518, 124.35699295726924), (178.72495193536577, 124.3601484943091)], [(178.69503155665487, 124.37924966917492), (178.71260200297033, 124.38673331217655)], [(178.7046643912748, 124.3557138302883), (178.70835043520765, 124.33429857791447)], [(178.70386630037348, 124.37650762433955), (178.7010653987088, 124.36527448052453)], [(178.7241236665972, 124.3642539227943), (178.69984151057, 124.38027321622313)], [(178.72166527734592, 124.36226087493648), (178.72902730607797, 124.36110123893042)], [(178.6790464544961, 124.36831421963815), (178.69000437550545, 124.35480872192817)], [(178.6806517665921, 124.35658667876355), (178.70085580898834, 124.36776003300065)], [(178.678213687503, 124.34424117329009), (178.6860527735873, 124.35354071907985)], [(178.68026544259155, 124.34110899164901), (178.6722704371041, 124.3449626101106)], [(178.7223322471133, 124.34094475356439), (178.74690005020196, 124.32414170864423)], [(178.68504266175324, 124.3584668982736), (178.6793423715963, 124.37986637004241)], [(178.69764105510026, 124.34869923738286), (178.70742092105237, 124.356144234524)], [(178.68585494222333, 124.36437966638678), (178.6694148081001, 124.34270230845792)], [(178.68722826454942, 124.3817698460023), (178.68870390668081, 124.36373625098412)], [(178.7208807751554, 124.37172559375762), (178.6992739815352, 124.36378763812016)], [(178.70058043852515, 124.35936238864498), (178.7113222800087, 124.34996026661572)] + CALL_1379@GraphGeneration.gov + CALL_1379 + + + CALR + [(25.793830415434137, 156.68592262583098), (25.79386759046882, 156.66490547871658)], [(25.803478113771348, 156.7038562251108), (25.823303534248247, 156.70107872718617)], [(25.81266141119138, 156.67782405426018), (25.81426927729917, 156.65379053953893)], [(25.842620024241956, 156.68537753282808), (25.865018208551007, 156.67408404139627)], [(25.830769641170107, 156.70009243867463), (25.832980307732093, 156.70917454160661)], [(25.819251250914704, 156.7040239270342), (25.819998581735586, 156.72726854899489)], [(25.8027753544117, 156.7014404727958), (25.807024256618185, 156.72472885586646)], [(25.818417673576587, 156.6636966335134), (25.830026961165327, 156.66339610232174)], [(25.82493920360983, 156.69180380223514), (25.819972697651302, 156.6872644092486)], [(25.84128821312878, 156.66052826407577), (25.86101516760729, 156.6546153902422)], [(25.839002893512408, 156.6783854709616), (25.827694495718674, 156.68221822035534)], [(25.817281229592624, 156.70437650640739), (25.803961035424667, 156.6961864210909)], [(25.80047716880567, 156.7029882623466), (25.804227622271615, 156.72191373107933)], [(25.82622486431979, 156.66368858078187), (25.801477297947685, 156.65794071193926)], [(25.814816382445375, 156.67639781184707), (25.805200036745287, 156.65708447817337)], [(25.823165955217608, 156.67249143379922), (25.840953432695645, 156.67554022885832)], [(25.799952814815857, 156.69950664727585), (25.814090344186617, 156.67715232673467)], [(25.805916181920605, 156.69081923936207), (25.784550139299306, 156.6801412568045)], [(25.83652763736234, 156.69507818367225), (25.833623855420385, 156.67787993848168)], [(25.826825051029285, 156.68845536250993), (25.802322751965384, 156.678687406833)], [(25.808096517805904, 156.70059712572598), (25.80749584359135, 156.6957283289377)], [(25.839253563853873, 156.66475764305835), (25.83387697639864, 156.66233820398924)], [(25.806724735482153, 156.67188634582345), (25.82563064437975, 156.67748873423076)], [(25.8108770082835, 156.6978718432943), (25.8290338197979, 156.70307590280078)], [(25.83588854888928, 156.66036416987492), (25.83039272827277, 156.68291065910964)], [(25.806586312764576, 156.69069131542722), (25.79212071589721, 156.67939873178875)], [(25.839597655532227, 156.68804933261225), (25.81741069189921, 156.70207364326933)], [(25.84291397065452, 156.6989111910386), (25.842681906308876, 156.6909005347585)], [(25.84170662599487, 156.65840401214825), (25.86010993638829, 156.65661161356385)], [(25.839427237283573, 156.66065276464835), (25.85767794967066, 156.68104683946308)], [(25.831853310121, 156.69265950078068), (25.852430400122422, 156.6876078976251)], [(25.823678617641495, 156.69121799566167), (25.83174874333902, 156.67573787669434)], [(25.819509290827085, 156.66844991506107), (25.80091295719179, 156.6482626858227)], [(25.834501001038475, 156.7041538886923), (25.821870126132584, 156.69263081800082)], [(25.810962107798897, 156.65683788214358), (25.83064120627578, 156.67436228225998)], [(25.821842735409003, 156.6608508258936), (25.796922172140842, 156.6712073385651)], [(25.798026665916236, 156.66814847416268), (25.804358812853796, 156.66904963958854)], [(25.836721732638985, 156.67104382170737), (25.84893823482885, 156.65940276126898)], [(25.80685456849023, 156.659582398144), (25.8118220866547, 156.63472883445556)], [(25.84220859674178, 156.69500732282037), (25.8237866257066, 156.67498506394242)], [(25.832937563086947, 156.67447510155762), (25.845223459998724, 156.68562248777104)], [(25.833987013881192, 156.68829732178284), (25.822756776700597, 156.68498076209988)], [(25.82821756139512, 156.6603767072113), (25.804718828619844, 156.68370823794052)], [(25.832975346006446, 156.6732070362976), (25.828109020020232, 156.6763323385783)], [(25.837783037186597, 156.70000568258135), (25.814132082021924, 156.71009569068738)], [(25.814221818540936, 156.7004545094058), (25.79046536399938, 156.7096268152616)], [(25.799993873032268, 156.67932569072383), (25.821631799522724, 156.6767686856252)], [(25.804182649081277, 156.7038727766538), (25.822399441541315, 156.6819761290876)], [(25.80856618047867, 156.65643771979052), (25.808725991065476, 156.67665268547415)], [(25.793959243443894, 156.6785715909022), (25.78562216033951, 156.66666071613014)] + CALL_1471@GraphGeneration.gov + CALL_1471 + + + CALR + [(71.30529400710132, 159.69954579043275), (71.28182676964595, 159.7161441053811)], [(71.27974910329294, 159.7200060023932), (71.28242745495062, 159.7431044070106)], [(71.30074578251711, 159.7122251844581), (71.32307292541944, 159.68861553393856)], [(71.30011466527355, 159.69233210148866), (71.2781324282422, 159.7080265971041)], [(71.3032556332566, 159.7162136333786), (71.31987842392276, 159.71534764120278)], [(71.30432302852725, 159.73895200331634), (71.29466721432298, 159.71408472193738)], [(71.28256016146389, 159.72698054144726), (71.2778212673205, 159.71294034806286)], [(71.2850694289528, 159.6977347526994), (71.30705607049181, 159.682100892911)], [(71.28615964409886, 159.73711390817888), (71.3009670534839, 159.74857395706343)], [(71.26335138508179, 159.7282519485816), (71.26649454237015, 159.73089480395274)], [(71.26048735307108, 159.7342842105959), (71.26804269614927, 159.73747455270043)], [(71.26512864289371, 159.69895574961868), (71.28988969298706, 159.68692993758725)], [(71.26329401301952, 159.72172069340712), (71.25631808971222, 159.73183532650444)], [(71.30062169011835, 159.72282864724306), (71.2884986408618, 159.72617559966596)], [(71.29373780467384, 159.7335093720846), (71.28159818113157, 159.74065397398314)], [(71.28098164973136, 159.70968057547788), (71.25912635530587, 159.68594880987624)], [(71.2753878357016, 159.7337269539051), (71.25591143284018, 159.73969805588902)], [(71.2673543179149, 159.71659344612846), (71.26652900944595, 159.7140377683854)], [(71.27578249129124, 159.73090609223345), (71.28160579054652, 159.72168948690853)], [(71.30805608754524, 159.7264038173672), (71.31870573106194, 159.70757559880184)], [(71.27174559508671, 159.69668363077906), (71.26969954560214, 159.7018596415527)], [(71.29017732038909, 159.70173630339875), (71.30345550033395, 159.6781589827376)], [(71.28980321667373, 159.73351166583416), (71.29132402185775, 159.72125143997377)], [(71.28758517944762, 159.7041835931118), (71.26752565431534, 159.72687665593833)], [(71.29808651108075, 159.71700549928212), (71.32116331356706, 159.7199085558451)], [(71.30090219054286, 159.69706325622977), (71.27984477710781, 159.70881959402888)], [(71.26383295015623, 159.73962664286182), (71.24753188458057, 159.75777673872588)], [(71.30667804734973, 159.7412862690798), (71.30688563040397, 159.757082273065)], [(71.29228315734528, 159.71799724311504), (71.30452277316788, 159.69924548229)], [(71.30690913478583, 159.71413371155109), (71.29809536427658, 159.72045422290168)], [(71.3086056357854, 159.71990868216344), (71.31269599096356, 159.72281009656294)], [(71.29247266742362, 159.70721867556915), (71.27056278886475, 159.70966273949062)], [(71.28555684570387, 159.72095702459072), (71.27360513840188, 159.70659951616292)], [(71.28895330728544, 159.70288955331023), (71.28810779261401, 159.71345157532747)], [(71.26898093043043, 159.73386820420825), (71.28563165488926, 159.70949417246214)], [(71.28449699334968, 159.7278383575248), (71.28132238748083, 159.7311636428309)], [(71.26338114345363, 159.72382750366384), (71.24938989988848, 159.72365598754874)], [(71.27137078129121, 159.71892495913136), (71.27366046983431, 159.69509040847637)], [(71.29004237335464, 159.70131923857042), (71.26824026425295, 159.69106481702653)], [(71.26927935435982, 159.73896747407943), (71.24985727820221, 159.74746690467995)], [(71.27672755892323, 159.71113411729232), (71.29885037540242, 159.68969134898663)], [(71.29569731357256, 159.7104493772465), (71.3094458527273, 159.6922097579198)], [(71.28256397425781, 159.73713127061228), (71.29915378818473, 159.75234709084697)], [(71.29520525821754, 159.70878917402405), (71.29879313380461, 159.68492757905466)], [(71.3041420942759, 159.71457278521135), (71.32440255107926, 159.7095434392067)], [(71.27790261398283, 159.73560449282706), (71.29591862582416, 159.7420510521444)], [(71.29135727455268, 159.71828906519843), (71.30320637177817, 159.70051284820815)], [(71.27139750884804, 159.7333798677096), (71.28374324860297, 159.72349307174636)], [(71.28727188300108, 159.71425907057468), (71.28853369300788, 159.73918578366792)], [(71.28559715390362, 159.7165580818004), (71.30968831853453, 159.7321307553238)] + CALL_1563@GraphGeneration.gov + CALL_1563 + + + CALR + [(165.44241141325193, 145.40751468398773), (165.44129366575862, 145.42895208841855)], [(165.43400426082974, 145.40429764710026), (165.41008826058808, 145.40086759876738)], [(165.47570464775967, 145.37086220099894), (165.47470352269042, 145.39526713652066)], [(165.4679190196674, 145.36387264874216), (165.47433279287168, 145.3739152578356)], [(165.45118226427778, 145.40210769341024), (165.46588429775164, 145.3828434820354)], [(165.44784637647055, 145.3783560672535), (165.46712167639689, 145.3732628325983)], [(165.46319972638844, 145.40454637887245), (165.4472949696907, 145.38893972024866)], [(165.4810885031986, 145.386298012183), (165.4907760087474, 145.37880517638968)], [(165.46205104661294, 145.36381711657788), (165.45220575973178, 145.37303956039653)], [(165.44319476751397, 145.38374795040647), (165.42733361726917, 145.3731089705266)], [(165.43912053905075, 145.37884524427074), (165.4329179256832, 145.401408418712)], [(165.44005127015117, 145.39708836318377), (165.42352159313555, 145.3914532764678)], [(165.4748343343059, 145.36625843248245), (165.4792592917545, 145.35903784069464)], [(165.4339020969745, 145.38855861993753), (165.4145423434426, 145.41249975866344)], [(165.43439510862032, 145.38419821574084), (165.41973824371127, 145.40218924565033)], [(165.4709012964644, 145.39421035734182), (165.45616866214152, 145.38365643465963)], [(165.44843718579742, 145.36946542561907), (165.44679235798938, 145.38569902436927)], [(165.45582699652977, 145.37011984734013), (165.44220962434355, 145.39387649626605)], [(165.47216067830766, 145.39229293169035), (165.45848698752602, 145.3707957992554)], [(165.47639105921806, 145.39347681586014), (165.47053834329782, 145.41093249090983)], [(165.44584433941574, 145.35963344464267), (165.43154302312712, 145.35994745369533)], [(165.47975125915372, 145.3672347510043), (165.46310021590634, 145.3423932900746)], [(165.44450147676568, 145.38482543099187), (165.42196433397805, 145.3608295144869)], [(165.44698746658318, 145.3756146296975), (165.4646751634074, 145.38546451557463)], [(165.46994097160098, 145.3717895902611), (165.47601448448157, 145.38913537593726)], [(165.47209358029525, 145.40463799595304), (165.45689264481598, 145.38570123219833)], [(165.43352924778645, 145.40524657148418), (165.451137604217, 145.39782634949208)], [(165.46932661094127, 145.4051323887782), (165.4883409524534, 145.393586594696)], [(165.4393920886665, 145.39516596187494), (165.43559471414895, 145.41172317501034)], [(165.43894492431895, 145.3689102319123), (165.44661779022306, 145.35393403845993)], [(165.4728055881842, 145.3589170927649), (165.47741224995607, 145.3568822810105)], [(165.45321779687833, 145.4002223614872), (165.46289620111446, 145.40228014353997)], [(165.48014547556332, 145.39736037474987), (165.50311224427088, 145.37770440083222)], [(165.48174179755182, 145.38560902770294), (165.48320875912893, 145.3620511904183)], [(165.444161332737, 145.38255050970986), (165.4660188644337, 145.405343112064)], [(165.4479174989805, 145.3998183695135), (165.44055288056106, 145.4135550738288)], [(165.47378668519082, 145.39383380964523), (165.4759131177977, 145.36936008382884)], [(165.48124150263607, 145.4045109641002), (165.48718880702083, 145.4180794166098)], [(165.44869909292416, 145.36947009987367), (165.45593997383918, 145.39445262634052)], [(165.47669036861967, 145.37105904566977), (165.48661267615847, 145.36269286269084)], [(165.44485151284835, 145.36404093462593), (165.4638535107104, 145.35152469856817)], [(165.46014943349414, 145.36215456308378), (165.4628238788986, 145.38648949160077)], [(165.44808311129313, 145.4006420584566), (165.45382446433163, 145.40910742179372)], [(165.47978222979032, 145.40494432881314), (165.5007580634657, 145.40073408329357)], [(165.46649767699432, 145.3885646742391), (165.47418875748278, 145.4051261259165)], [(165.43866602797834, 145.40335860747828), (165.44028232575823, 145.397236158134)], [(165.44842447837257, 145.38333033937243), (165.4603483864233, 145.3875776773331)], [(165.46597627197843, 145.3859375616854), (165.47898796004162, 145.4003869417178)], [(165.4357138140332, 145.40820834951697), (165.41910951164044, 145.42092939693146)], [(165.43372097895337, 145.40566238221044), (165.41066309804233, 145.40931213200605)] + CALL_1655@GraphGeneration.gov + CALL_1655 + + + CALR + [(44.06615435264149, 177.3379766480493), (44.06199659659501, 177.34105720110443)], [(44.09074358624136, 177.31515934405928), (44.080191530315965, 177.30138029840694)], [(44.08303033244203, 177.32205691404548), (44.079368799081685, 177.2985475103287)], [(44.0773910760075, 177.3162673075749), (44.07331891713155, 177.3166311777809)], [(44.09435243234118, 177.33266644044437), (44.09720927381237, 177.35113808026261)], [(44.07383868046588, 177.32995474912244), (44.09641140940722, 177.32655227394227)], [(44.09437037653532, 177.3396839355577), (44.08969718850129, 177.34532225744178)], [(44.07552118193232, 177.3342174009807), (44.091974328017216, 177.315366999728)], [(44.10000067091507, 177.34089839512248), (44.102995012842776, 177.34008937829242)], [(44.08585904007541, 177.33772761337295), (44.10114284878255, 177.35694595103809)], [(44.102259371491364, 177.34449075736626), (44.07937822036226, 177.35827824700894)], [(44.08351111839961, 177.34424756414467), (44.06213329345779, 177.3661396267604)], [(44.08061064930311, 177.34364704260935), (44.09830405902897, 177.3602684045178)], [(44.102407752047654, 177.35194609047142), (44.07950389018829, 177.34339842606985)], [(44.06249615752652, 177.30738250662466), (44.059117541300424, 177.2851582245779)], [(44.072582711097276, 177.31139996894237), (44.076870946078685, 177.32170553080203)], [(44.101945945538105, 177.3542874073039), (44.1218690912307, 177.35799899824772)], [(44.07899851303123, 177.30891663289242), (44.08561387889639, 177.294228992209)], [(44.08632140367917, 177.32200495233678), (44.06468691498397, 177.32743148020197)], [(44.05896700316253, 177.3432071142238), (44.07481195812063, 177.32863649666913)], [(44.0601182548832, 177.32506377300913), (44.05015368816263, 177.3177672750297)], [(44.07642805742831, 177.3527334797723), (44.05193657043589, 177.35315542491597)], [(44.08158563901459, 177.34995046700547), (44.09458927000466, 177.3570739636878)], [(44.07541201683873, 177.3084383469605), (44.10039569208362, 177.31991769275436)], [(44.07421326448588, 177.34888919788142), (44.07593356473474, 177.32617331312835)], [(44.073587029709955, 177.33870574524877), (44.08006209175832, 177.32560015432207)], [(44.08497081208849, 177.3498337858699), (44.10449993855566, 177.3627970163674)], [(44.10217308160898, 177.32920529771312), (44.121377211113284, 177.33507654788139)], [(44.097235082064785, 177.35269880930872), (44.07553482519306, 177.3623931966718)], [(44.091943598461754, 177.33350777612384), (44.10586414303518, 177.3523746892843)], [(44.081339677701216, 177.34958923881783), (44.06509503831523, 177.3737021119943)], [(44.08505288132958, 177.32938895488547), (44.10349140461058, 177.3256274375367)], [(44.096027502580476, 177.3514837358206), (44.081456936224264, 177.3452446710541)], [(44.08605768327106, 177.32252881533006), (44.07360825091767, 177.33910797790287)], [(44.079762606558795, 177.33646874644026), (44.08087352480629, 177.33166708265668)], [(44.078001809984464, 177.3356737319347), (44.05936763966197, 177.34970771904912)], [(44.06389627634254, 177.30595866229623), (44.07593775452007, 177.28613654653424)], [(44.08591785540742, 177.32090780864505), (44.07185090946954, 177.32306320141709)], [(44.083886258470585, 177.323319936231), (44.07854157326081, 177.33788082522398)], [(44.09264373286504, 177.3410279990015), (44.06962361431883, 177.32576631709492)], [(44.08811155770472, 177.344531693234), (44.100729355628815, 177.35970645003388)], [(44.103610240653886, 177.34259473868397), (44.110179865732206, 177.3566884619703)], [(44.09073948163323, 177.3348492521116), (44.100302876897835, 177.3101130266441)], [(44.078723636881406, 177.35100348118326), (44.061505258126545, 177.3745828020972)], [(44.07652849667099, 177.33570201430595), (44.07029782239287, 177.34233614378675)], [(44.085743228516705, 177.31900153978756), (44.06958199831377, 177.30880154363734)], [(44.0753684656375, 177.32131396244176), (44.08407337672991, 177.3385364776596)], [(44.07252322591356, 177.33657110531212), (44.07755961530215, 177.3403322623514)], [(44.103656343158605, 177.3210326540053), (44.10276295884911, 177.3459150884081)], [(44.08439694807512, 177.31172442401987), (44.097704846992215, 177.3138194551985)] + CALL_1747@GraphGeneration.gov + CALL_1747 + + + CALR + [(100.38233674991841, 176.72056053761634), (100.39732456935684, 176.7446471508095)], [(100.41077330371007, 176.6833987269306), (100.42542021113503, 176.6608551005327)], [(100.39082976143477, 176.7276044592409), (100.39715150884894, 176.74444316506327)], [(100.37738634574418, 176.71111390775846), (100.38528881424087, 176.73240893110784)], [(100.38123268646552, 176.70596862775903), (100.36242377346977, 176.69524247746625)], [(100.41957746436546, 176.69201432784496), (100.40215391471595, 176.69641851944777)], [(100.39229803433669, 176.70950379125793), (100.37261915584267, 176.7240161191066)], [(100.3983180760309, 176.71211541630043), (100.39178246646794, 176.71966687170186)], [(100.39172568563718, 176.71949285799283), (100.40125408362579, 176.70958559324274)], [(100.41097361617915, 176.6849546451594), (100.39068015201727, 176.68887542362296)], [(100.41827446693533, 176.68246049172345), (100.43480848335956, 176.69917208967757)], [(100.40597276617659, 176.72542256095792), (100.42261533410306, 176.7140284309969)], [(100.3761392394486, 176.68640466977118), (100.36750454314802, 176.71087418443778)], [(100.40594668731622, 176.71799692687418), (100.38405799364902, 176.73902031175257)], [(100.41611204533983, 176.69589398865836), (100.40035999506075, 176.6800768144491)], [(100.41025080461937, 176.7202342535972), (100.39022292456768, 176.69803950194532)], [(100.38048493052808, 176.68449551799964), (100.40420213668537, 176.70345496348006)], [(100.37156568060047, 176.69857479419267), (100.39625883918174, 176.69796447510694)], [(100.39520212427286, 176.7194071523205), (100.41536147869624, 176.73690672221818)], [(100.38419558556298, 176.70301712361552), (100.38499702804455, 176.69946669696964)], [(100.39183525654337, 176.69936839494417), (100.40023351083211, 176.67725754214197)], [(100.41765746220766, 176.68216819089395), (100.41970973027554, 176.6933389545706)], [(100.40239756888583, 176.70754704764533), (100.385810309486, 176.7003224507119)], [(100.37246261322693, 176.7124303004275), (100.36661297472163, 176.70268889641994)], [(100.37831056236845, 176.72759154880245), (100.35928994986641, 176.74353176201456)], [(100.37800637298412, 176.71149259391788), (100.39838017862547, 176.73518995055946)], [(100.38311301866163, 176.7149509158479), (100.36591051627276, 176.7223019783249)], [(100.40892200551843, 176.71808860877465), (100.39137704001159, 176.7299120231409)], [(100.40686473314534, 176.71252649202737), (100.39499971994519, 176.69273992785756)], [(100.37426025962482, 176.70744777656597), (100.39227874257247, 176.7152860366251)], [(100.38555528811423, 176.69772846370734), (100.36646719200266, 176.67393395995796)], [(100.41369969644308, 176.68462655479823), (100.42905491723981, 176.69892983507123)], [(100.39207682484896, 176.69853661200776), (100.38934087749625, 176.68668004955694)], [(100.40636210567199, 176.69568605971466), (100.42349917119252, 176.67212916553163)], [(100.39087790360098, 176.72602113643748), (100.39025171757572, 176.70887178738343)], [(100.41509399348124, 176.7112522506051), (100.43752217664861, 176.69410192433872)], [(100.41694025076828, 176.68091768392068), (100.41461652260487, 176.69521067706506)], [(100.40203835617167, 176.70725535892333), (100.41458624791115, 176.6912494617687)], [(100.3708854662903, 176.69189697744858), (100.35776030576581, 176.70845089722403)], [(100.40405378237318, 176.70928077097062), (100.42591642928141, 176.7111814134926)], [(100.38481632959986, 176.707216195234), (100.40656074115134, 176.69800818273902)], [(100.3742700492894, 176.68115054276896), (100.38637772370667, 176.65619807193244)], [(100.37385473275677, 176.695787174213), (100.35819914654071, 176.6871796819125)], [(100.41593800494951, 176.71288272311455), (100.42154352578225, 176.72479881808033)], [(100.3823754229288, 176.71611310848522), (100.36968765649546, 176.7387195223214)], [(100.40014749683148, 176.7139136425304), (100.39876477317559, 176.7194223658032)], [(100.39701059129595, 176.72107411748678), (100.41598807195328, 176.7432209501556)], [(100.3811447004315, 176.7212434899088), (100.37361120465685, 176.7269244575528)], [(100.41906291432308, 176.68843342239543), (100.41498570053113, 176.6681463919777)], [(100.40885878847952, 176.72374074911784), (100.40740572666829, 176.72611585465847)] + CALL_1839@GraphGeneration.gov + CALL_1839 + + + CALR + [(190.64087145425094, 195.66780168639224), (190.6471876976333, 195.65324779278075)], [(190.65793413033208, 195.64038248081397), (190.67800027665254, 195.63558152114254)], [(190.61127697017886, 195.64706841429674), (190.61396700416952, 195.67059797861074)], [(190.613382710657, 195.65388239886187), (190.621547500933, 195.65511337622286)], [(190.65145561413976, 195.63582113698192), (190.6302879582545, 195.63905173581202)], [(190.63421714958486, 195.64182182968204), (190.6526319971942, 195.647965343716)], [(190.64097286254162, 195.64614567474257), (190.65832543813772, 195.65613907177115)], [(190.65279331378673, 195.6746625205397), (190.67191332181807, 195.67029945562257)], [(190.6246062885783, 195.67497710300503), (190.61969229905776, 195.66514783971522)], [(190.62834192005838, 195.66208256080873), (190.6529331267554, 195.65087569389684)], [(190.61615975562486, 195.64629340086594), (190.59896429060905, 195.6514650610897)], [(190.6203029940933, 195.6340229196785), (190.59951098218463, 195.64979315265265)], [(190.64706405663006, 195.64142530968158), (190.6293067495477, 195.65011369782175)], [(190.62548006935313, 195.6354928288039), (190.64059929440438, 195.62938568062086)], [(190.65323027238176, 195.65857779969966), (190.65678777140155, 195.66685097302746)], [(190.62491529301553, 195.65975143622373), (190.64009693490658, 195.68195605467795)], [(190.65571589573767, 195.6714464665681), (190.66051483298088, 195.67878366834992)], [(190.61632357237497, 195.65426423735585), (190.62730359962706, 195.66204068148963)], [(190.6423507593815, 195.66271554184613), (190.64344431436305, 195.68438136901364)], [(190.6419639188307, 195.63704752957207), (190.62691632022532, 195.61570137929604)], [(190.61994737159705, 195.64594547602275), (190.63906576421232, 195.63085290608657)], [(190.6525573410218, 195.6735661023715), (190.66228230393017, 195.65382290181316)], [(190.62772830100215, 195.66401096361892), (190.6332679629348, 195.68129075256985)], [(190.61242933907508, 195.67495545608793), (190.59126728122766, 195.6799726890429)], [(190.6387337497848, 195.66934643566108), (190.661584038529, 195.65257217368918)], [(190.65248726617236, 195.64902032802004), (190.64898109872448, 195.66058209740783)], [(190.61495030855227, 195.6680110181368), (190.594989425481, 195.65657390716345)], [(190.6278530707747, 195.65846771367694), (190.61811267089584, 195.63902345869937)], [(190.64923912242304, 195.6663187838087), (190.66491368077862, 195.6875989604084)], [(190.64898557718047, 195.67010849708234), (190.65826975806905, 195.65324851062542)], [(190.64313170609012, 195.64085299899162), (190.65963453409262, 195.65616739510338)], [(190.6319187850608, 195.67340647061033), (190.61970360206882, 195.6531136008313)], [(190.63792425909523, 195.6463806555468), (190.61320722925808, 195.64568788320693)], [(190.63874310315666, 195.62927949621934), (190.6602300025264, 195.63214682721468)], [(190.64676065457138, 195.6422652879118), (190.64171074977807, 195.64176081073532)], [(190.65806541261264, 195.65569928310774), (190.68245486595328, 195.65444595008984)], [(190.6419075140538, 195.66970145647664), (190.65088571765293, 195.67053979024175)], [(190.6277523827463, 195.6572468095835), (190.60283388394873, 195.6476489263654)], [(190.64936035694086, 195.64398863164357), (190.64864448722895, 195.6331216051457)], [(190.6445667111891, 195.66166602109698), (190.62000621268768, 195.64107571844193)], [(190.6353864317928, 195.66840978280408), (190.6567255159688, 195.66717936128876)], [(190.62506243409362, 195.6572025587481), (190.64974361582014, 195.66090219537625)], [(190.628715944111, 195.66183401708918), (190.6311458973602, 195.68485322544734)], [(190.62207698054698, 195.63035172541), (190.62054784607335, 195.65134498017673)], [(190.65493656524325, 195.65782031343997), (190.66818694821544, 195.66500405369567)], [(190.6483021460297, 195.6436890606508), (190.64860789896147, 195.66513136049377)], [(190.6455428435414, 195.65261564994472), (190.64597039306625, 195.65342041069326)], [(190.65425339543975, 195.63825517566193), (190.63021897965652, 195.63962270452683)], [(190.6349234146997, 195.65026931610635), (190.6254561307201, 195.64953721837975)], [(190.65429296548882, 195.63921011336694), (190.64341940999108, 195.61429631900054)] + CALL_1931@GraphGeneration.gov + CALL_1931 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/configfiles/inputs/test-medium-911-calls.xml b/configfiles/inputs/test-medium-911-calls.xml new file mode 100644 index 000000000..6a58c0f15 --- /dev/null +++ b/configfiles/inputs/test-medium-911-calls.xml @@ -0,0 +1,34166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/configfiles/test-small-911.xml b/configfiles/test-small-911.xml index e6f554bfb..80fd7f54e 100644 --- a/configfiles/test-small-911.xml +++ b/configfiles/test-small-911.xml @@ -9,7 +9,8 @@ 1 - 100 + + 1 25 diff --git a/docs/Developer/CMake.md b/docs/Developer/CMake.md index b0eb6a3e9..fe84ace42 100644 --- a/docs/Developer/CMake.md +++ b/docs/Developer/CMake.md @@ -24,4 +24,6 @@ - Verbose output: https://sidvind.com/wiki/CMake/Verbose_output +# Examples +- To build for profiling on the GPU: cmake .. -D ENABLE_CUDA=YES -DCMAKE_BUILD_TYPE=Profiling diff --git a/docs/Developer/CpuGpuArchitecture.md b/docs/Developer/CpuGpuArchitecture.md new file mode 100644 index 000000000..8462491a1 --- /dev/null +++ b/docs/Developer/CpuGpuArchitecture.md @@ -0,0 +1,155 @@ +## CPU GPU Architecture + +Graphitti is a high-performance simulator of graph-based systems, currently being applied to computational neuroscience and emergency communication systems. It runs on both CPUs and GPUs and can simulate very large graphs (tens of thousands of vertices; hundreds of thousands to millions of edges) for long durations (billions of time steps). + +The typical process for implementing a new system using Graphitti is to implement the system on the CPU and then build a corresponding GPU implementation. + + + +When creating the GPU implementation, we take care to implement the logic so that it easily maps to the CPU implementation. For example, we have 3 separate methods in the CPU All911Vertices class defining how a vertex should advance depending on the type of vertex that it is (caller region, PSAP, or emergency responder). In the GPU All911Vertices class, we mirror this by defining 3 separate kernel methods that hold similar logic, but work on the corresponding Device data members. + +CPU implementation of advanceCALR method for advancing a caller region vertex: +```cpp +void All911Vertices::advanceCALR(BGSIZE vertexIdx, All911Edges &edges911, + const EdgeIndexMap &edgeIndexMap) +{ + // There is only one outgoing edge from CALR to a PSAP + BGSIZE start = edgeIndexMap.outgoingEdgeBegin_[vertexIdx]; + BGSIZE edgeIdx = edgeIndexMap.outgoingEdgeIndexMap_[start]; + + // Check for dropped calls, indicated by the edge not being available + if (!edges911.isAvailable_[edgeIdx]) { + // If the call is still there, it means that there was no space in the PSAP's waiting + // queue. Therefore, this is a dropped call. + // If readialing, we assume that it happens immediately and the caller tries until + // getting through. + if (!edges911.isRedial_[edgeIdx] && initRNG.randDblExc() >= redialP_) { + // We only make the edge available if no readialing occurs. + edges911.isAvailable_[edgeIdx] = true; + LOG4CPLUS_DEBUG(vertexLogger_, "Did not redial at time: " << edges911.call_[edgeIdx].time); + } else { + // Keep the edge unavailable but mark it as a redial + edges911.isRedial_[edgeIdx] = true; + } + } + + // peek at the next call in the queue + optional nextCall = vertexQueues_[vertexIdx].peek(); + if (edges911.isAvailable_[edgeIdx] && nextCall && nextCall->time <= g_simulationStep) { + // Calls that start at the same time are process in the order they appear. + // The call starts at the current time step so we need to pop it and process it + vertexQueues_[vertexIdx].get(); // pop from the queue + + // Place new call in the edge going to the PSAP + assert(edges911.isAvailable_[edgeIdx]); + edges911.call_[edgeIdx] = nextCall.value(); + edges911.isAvailable_[edgeIdx] = false; + LOG4CPLUS_DEBUG(vertexLogger_, "Calling PSAP at time: " << nextCall->time); + } +} +``` + +Corresponding GPU kernel method for advancing a caller region vertex: +```cpp +CUDA_CALLABLE void advanceCALRVerticesDevice(int vertexId, + int totalNumberOfEvents, + uint64_t simulationStep, + BGFLOAT redialProbability, + All911EdgesDeviceProperties *allEdgesDevice, + EdgeIndexMapDevice *edgeIndexMapDevice) +{ + // There is only one outgoing edge from CALR to a PSAP + BGSIZE start = edgeIndexMapDevice->outgoingEdgeBegin_[vertexId]; + BGSIZE edgeIdx = edgeIndexMapDevice->outgoingEdgeIndexMap_[start]; + + // Check for dropped calls, indicated by the edge not being available + if (!allEdgesDevice->isAvailable_[edgeIdx]) { + // If the call is still there, it means that there was no space in the PSAP's waiting + // queue. Therefore, this is a dropped call. + // If readialing, we assume that it happens immediately and the caller tries until + // getting through. + if (!allEdgesDevice->isRedial_[edgeIdx] && initRNG.randDblExc() >= redialProbability) { + // We only make the edge available if no readialing occurs. + allEdgesDevice->isAvailable_[edgeIdx] = true; + //LOG4CPLUS_DEBUG(vertexLogger_, "Did not redial at time: " << edges911.call_[edgeIdx].time); + } else { + // Keep the edge unavailable but mark it as a redial + allEdgesDevice->isRedial_[edgeIdx] = true; + } + } + + // peek at the next call in the queue + uint64_t queueEndIndex = allVerticesDevice->vertexQueuesEnd_[vertexId]; + if (allEdgesDevice->isAvailable_[edgeIdx] && + (allVerticesDevice->vertexQueuesFront_[vertexId] != queueEndIndex) && + allVerticesDevice->vertexQueuesBufferTime_[vertexId][queueEndIndex] <= simulationStep) { + // Place new call in the edge going to the PSAP + assert(allEdgesDevice->isAvailable_[edgeIdx]); + // Calls that start at the same time are process in the order they appear. + // The call starts at the current time step so we need to pop it and process it + + // Process the call + allEdgesDevice->vertexId_[edgeIdx] = allVerticesDevice->vertexQueuesBufferVertexId_[vertexId][queueEndIndex]; + allEdgesDevice->time_[edgeIdx] = allVerticesDevice->vertexQueuesBufferTime_[vertexId][queueEndIndex]; + allEdgesDevice->duration_[edgeIdx] = allVerticesDevice->vertexQueuesBufferDuration_[vertexId][queueEndIndex]; + allEdgesDevice->x_[edgeIdx] = allVerticesDevice->vertexQueuesBufferX_[vertexId][queueEndIndex]; + allEdgesDevice->y_[edgeIdx] = allVerticesDevice->vertexQueuesBufferY_[vertexId][queueEndIndex]; + allEdgesDevice->patience_[edgeIdx] = allVerticesDevice->vertexQueuesBufferPatience_[vertexId][queueEndIndex]; + allEdgesDevice->onSiteTime_[edgeIdx] = allVerticesDevice->vertexQueuesBufferOnSiteTime_[vertexId][queueEndIndex]; + allEdgesDevice->responderType_[edgeIdx] = allVerticesDevice->vertexQueuesBufferResponderType_[vertexId][queueEndIndex]; + + // Pop from the queue + allVerticesDevice->vertexQueuesEnd_[vertexId] = (queueEndIndex + 1) % totalNumberOfEvents; + allEdgesDevice->isAvailable_[edgeIdx] = false; + //LOG4CPLUS_DEBUG(vertexLogger_, "Calling PSAP at time: " << nextCall->time); + } +} +``` +In the case where a data structure isn't implemented in CUDA, we expand out the CPU implementation and directly implement this on the GPU. + +Transfering a call in the integrateVertexInputs method on the CPU involves calling a Queue.Put() method: +```cpp +// Transfer call to destination +dstQueue.put(all911Edges.call_[edgeIdx]); +``` + +dstQueue is of type CircularBuffer defined in the CircularBuffer.h: +```cpp +void put(T element) +{ + // We throw an error if the buffer is full + assert(!isFull()); + + // Insert the new element and increment the front index + buffer_[front_] = element; + front_ = (front_ + 1) % buffer_.size(); +} + +bool isFull() const +{ + return ((front_ + 1) % buffer_.size()) == end_; +} +``` + +When we expand it and implement on the GPU, we get an implementation like below: +```cpp +uint64_t queueFrontIndex = allVerticesDevice->vertexQueuesFront_[dstIndex]; +uint64_t queueEndIndex = allVerticesDevice->vertexQueuesEnd_[dstIndex]; + +// Transfer call to destination +// We throw an error if the buffer is full +assert(!(((queueFrontIndex + 1) % totalNumberOfEvents) == queueEndIndex)); + +// Insert the new element and increment the front index +allVerticesDevice->vertexQueuesBufferVertexId_[dstIndex][queueFrontIndex] = allEdgesDevice->vertexId_[edgeIdx]; +allVerticesDevice->vertexQueuesBufferTime_[dstIndex][queueFrontIndex] = allEdgesDevice->time_[edgeIdx]; +allVerticesDevice->vertexQueuesBufferDuration_[dstIndex][queueFrontIndex] = allEdgesDevice->duration_[edgeIdx]; +allVerticesDevice->vertexQueuesBufferX_[dstIndex][queueFrontIndex] = allEdgesDevice->x_[edgeIdx]; +allVerticesDevice->vertexQueuesBufferY_[dstIndex][queueFrontIndex] = allEdgesDevice->y_[edgeIdx]; +allVerticesDevice->vertexQueuesBufferPatience_[dstIndex][queueFrontIndex] = allEdgesDevice->patience_[edgeIdx]; +allVerticesDevice->vertexQueuesBufferOnSiteTime_[dstIndex][queueFrontIndex] = allEdgesDevice->onSiteTime_[edgeIdx]; +allVerticesDevice->vertexQueuesBufferResponderType_[dstIndex][queueFrontIndex] = allEdgesDevice->responderType_[edgeIdx]; + +allVerticesDevice->vertexQueuesFront_[dstIndex] = (queueFrontIndex + 1) % totalNumberOfEvents; +``` +where the size of each dstQueue is the total number of events to be run in the simulator. \ No newline at end of file diff --git a/docs/Developer/RegressionTestsDocumentation.md b/docs/Developer/RegressionTestsDocumentation.md new file mode 100644 index 000000000..279a022eb --- /dev/null +++ b/docs/Developer/RegressionTestsDocumentation.md @@ -0,0 +1,63 @@ +# NG911 Tests +This document outlines the parameters used by NG911 regression tests. There are three files required to run an NG911 test; the Configuration file, the Graph file, and the Input calls files. For each of these files, a table is provided showing the main parameters in the file and their values for the existing NG911 tests. + +# Configuration files +| Parameter | test-small-911.xml | test-medium-911.xml | +|:------|:------:|:------:| +| Epoch duration | 900 | 200 | +| Number of epochs | 2 | 1440 | +| Redial probability | 0.85 | 0.85 | +| Average driving speed | 30 | 30 | + +# Graph files +| Parameter | test-small-911.graphml | test-medium-911.graphml | +|:------|:------:|:------:| +| Number of Vertices | 12 | 1932 | +| Number of Caller Regions | 1 | 21 | +| Number of PSAPs | 1 | 21 | +| Min number of trunks for PSAPs | 5 | 5 | +| Max number of trunks for PSAPs | 5 | 10 | +| Min number of servers for PSAPs | 4 | 3 | +| Max number of servers for PSAPs | 4 | 5 | +| Number of EMS Responders | 3 | 630 | +| Number of Law Responders | 4 | 630 | +| Number of Fire Responders | 2 | 630 | +| Min number of trunks for Responders | 5 | 6 | +| Max number of trunks for Responders | 10 | 12 | +| Min number of servers for Responders | 3 | 3 | +| Max number of servers for Responders | 5 | 6 | + +# Input calls files +The parameters for the Input calls table are taken from the cluster_point_process.py file in Graphitti/Tools/InputGeneration/ClusterPointProcess + +| Parameter | test-medium-911-calls.xml | +|:------|:------:| +| Number of emergency calls | 34,119 | +| First (seconds) | 34 | +| Last (seconds) | 32436 | +| Mean Time Interval (seconds) | 62.88 | +| Dead Time after Event (seconds) | 1 | +| Mean Call Interval after incident (seconds) | 20 | +| Mean Duration (seconds) | 204 | +| Minimum Duration (seconds) | 4 | +| Mean Patience Time (seconds) | 50 | +| Mean On-Site Time (seconds) | 1200 | +| Type Ratio Law | 0.33 | +| Type Ratio EMS | 0.33 | +| Type Ratio Fire | 0.33 | +| Prototype 0 mu_r | 0.0005 | +| Prototype 0 sdev_r | 0.0001 | +| Prototype 0 mu_intensity | 500000 | +| Prototype 0 sdev_intensity | 50000 | +| Prototype 1 mu_r | 0.001 | +| Prototype 1 sdev_r | 0.0001 | +| Prototype 1 mu_intensity | 1000000 | +| Prototype 1 sdev_intensity | 60000 | +| Prototype 2 mu_r | 0.0015 | +| Prototype 2 sdev_r | 0.001 | +| Prototype 2 mu_intensity | 1100000 | +| Prototype 2 sdev_intensity | 70000 | +| Prototype 3 mu_r | 0.003 | +| Prototype 3 sdev_r | 0.001 | +| Prototype 3 mu_intensity | 1500000 | +| Prototype 3 sdev_intensity | 60000 |