From e135aaf72dd033983ffd76c48549addb284b1df0 Mon Sep 17 00:00:00 2001 From: Mikey Gower Date: Thu, 14 Sep 2023 15:57:46 -0400 Subject: [PATCH 01/22] add d3-hierarchy true to repo --- src/layout/hierarchy/index.ts | 117 ++----------- src/layout/hierarchy/tree/index.d.ts | 3 + src/layout/hierarchy/tree/index.js | 236 +++++++++++++++++++++++++++ src/layout/hierarchy/utils.ts | 94 +++++++++++ 4 files changed, 343 insertions(+), 107 deletions(-) create mode 100644 src/layout/hierarchy/tree/index.d.ts create mode 100644 src/layout/hierarchy/tree/index.js create mode 100644 src/layout/hierarchy/utils.ts diff --git a/src/layout/hierarchy/index.ts b/src/layout/hierarchy/index.ts index a68e2549..ad1181e5 100644 --- a/src/layout/hierarchy/index.ts +++ b/src/layout/hierarchy/index.ts @@ -1,109 +1,18 @@ -import { hierarchy, HierarchyPointNode, tree } from 'd3-hierarchy' -import { Node, Edge } from '../../trellis' +import type { Node, Edge } from '../../trellis' +import { findAncestor, hierarchyToGraph, graphToBFSHierarchy, graphToDFSHierarchy, SeparationFn, Hierarchy } from './utils' +import { hierarchy } from 'd3-hierarchy' +import tree from './tree' export type Options = Partial<{ x: number y: number nodeSize: [number, number] size: [number, number] - separation: (a: HierarchyPointNode, b: HierarchyPointNode) => number + separation: SeparationFn bfs: boolean }> -type Hierarchy = { - id: string - children: Hierarchy[] -} - -const DEFAULT_NODE_SIZE: [number, number] = [120, 240] - -/** - * utils - */ -const _graphToDFSHierarchy = (edgeIndex: Record, id: string, visited: Set): Hierarchy => { - visited.add(id) - - const children: Hierarchy[] = [] - - for (const child of edgeIndex[id]) { - if (!visited.has(child)) { - children.push(_graphToDFSHierarchy(edgeIndex, child, visited)) - } - } - - return { id, children } -} - -const graphToDFSHierarchy = (edgeIndex: Record, id: string): Hierarchy => _graphToDFSHierarchy(edgeIndex, id, new Set()) - -const graphToBFSHierarchy = (edgeIndex: Record, id: string): Hierarchy => { - const children: Hierarchy['children'] = [] - - const queue: (readonly [string, Hierarchy['children']])[] = [[id, children]] - - const visited = new Set([id]) - - while (queue.length > 0) { - const [id, children] = queue.shift()! - - for (const child of edgeIndex[id]) { - if (!visited.has(child)) { - visited.add(child) - const grandChildren: Hierarchy['children'] = [] - children.push({ id: child, children: grandChildren }) - queue.push([child, grandChildren] as const) - } - } - } - - return { - id, - children - } -} - -const _hierarchyToGraph = ( - hierarchy: HierarchyPointNode, - nodesById: Record | undefined> -) => { - nodesById[hierarchy.data.id] = hierarchy - - if (hierarchy.children !== undefined) { - for (const child of hierarchy.children) { - _hierarchyToGraph(child, nodesById) - } - } - - return nodesById -} - -const hierarchyToGraph = (hierarchy: HierarchyPointNode) => _hierarchyToGraph(hierarchy, {}) - -const containsSubgraphNode = (nodes: Node[], id: string): boolean => { - for (const node of nodes) { - if (node.id === id) return true - - if (node.subgraph !== undefined) { - const exists = containsSubgraphNode(node.subgraph.nodes, id) - if (exists) return true - } - } - - return false -} - -const findAncestor = (nodes: Node[], id: string): string | undefined => { - for (const node of nodes) { - if (node.id === id) return node.id - - if (node.subgraph !== undefined) { - const exists = containsSubgraphNode(node.subgraph.nodes, id) - if (exists) return node.id - } - } - - return undefined -} +export const DEFAULT_NODE_SIZE: [number, number] = [120, 240] export const Layout = () => { return (rootId: string, graph: { nodes: N[]; edges: E[]; options?: Options }) => { @@ -140,16 +49,10 @@ export const Layout = () => { layout(hierarchy(graph.options?.bfs !== false ? graphToBFSHierarchy(edgeIndex, root) : graphToDFSHierarchy(edgeIndex, root))) ) - // const positionedDataById = compose( - // hierarchyToGraph, - // tree().nodeSize(graph.options?.nodeSize ?? DEFAULT_NODE_SIZE), - // hierarchy, - // graph.options?.bfs !== false ? - // graphToBFSHierarchy(edgeIndex, root) : - // graphToDFSHierarchy(edgeIndex, root) - // ) - - const { x, y } = graph.nodes.find((node) => node.id === root) ?? { x: undefined, y: undefined } + const { x, y } = graph.nodes.find((node) => node.id === rootId) ?? { + x: undefined, + y: undefined + } const xOffset = (graph.options?.x ?? 0) + (x ?? 0) const yOffset = (graph.options?.y ?? 0) - (y ?? 0) diff --git a/src/layout/hierarchy/tree/index.d.ts b/src/layout/hierarchy/tree/index.d.ts new file mode 100644 index 00000000..4f59a965 --- /dev/null +++ b/src/layout/hierarchy/tree/index.d.ts @@ -0,0 +1,3 @@ +import { TreeLayout } from 'd3-hierarchy' +import { Hierarchy } from '../utils' +export default function (): TreeLayout diff --git a/src/layout/hierarchy/tree/index.js b/src/layout/hierarchy/tree/index.js new file mode 100644 index 00000000..ba90e0a3 --- /dev/null +++ b/src/layout/hierarchy/tree/index.js @@ -0,0 +1,236 @@ +import { Node } from 'd3-hierarchy/src/hierarchy' + +function defaultSeparation(a, b) { + return a.parent === b.parent ? 1 : 2 +} + +// function radialSeparation(a, b) { +// return (a.parent === b.parent ? 1 : 2) / a.depth; +// } + +// This function is used to traverse the left contour of a subtree (or +// subforest). It returns the successor of v on this contour. This successor is +// either given by the leftmost child of v or by the thread of v. The function +// returns null if and only if v is on the highest level of its subtree. +function nextLeft(v) { + var children = v.children + return children ? children[0] : v.t +} + +// This function works analogously to nextLeft. +function nextRight(v) { + var children = v.children + return children ? children[children.length - 1] : v.t +} + +// Shifts the current subtree rooted at w+. This is done by increasing +// prelim(w+) and mod(w+) by shift. +function moveSubtree(wm, wp, shift) { + var change = shift / (wp.i - wm.i) + wp.c -= change + wp.s += shift + wm.c += change + wp.z += shift + wp.m += shift +} + +// All other shifts, applied to the smaller subtrees between w- and w+, are +// performed by this function. To prepare the shifts, we have to adjust +// change(w+), shift(w+), and change(w-). +function executeShifts(v) { + var shift = 0, + change = 0, + children = v.children, + i = children.length, + w + while (--i >= 0) { + w = children[i] + w.z += shift + w.m += shift + shift += w.s + (change += w.c) + } +} + +// If vi-’s ancestor is a sibling of v, returns vi-’s ancestor. Otherwise, +// returns the specified (default) ancestor. +function nextAncestor(vim, v, ancestor) { + return vim.a.parent === v.parent ? vim.a : ancestor +} + +function TreeNode(node, i) { + this._ = node + this.parent = null + this.children = null + this.A = null // default ancestor + this.a = this // ancestor + this.z = 0 // prelim + this.m = 0 // mod + this.c = 0 // change + this.s = 0 // shift + this.t = null // thread + this.i = i // number +} + +TreeNode.prototype = Object.create(Node.prototype) + +function treeRoot(root) { + var tree = new TreeNode(root, 0), + node, + nodes = [tree], + child, + children, + i, + n + + while ((node = nodes.pop())) { + if ((children = node._.children)) { + node.children = new Array((n = children.length)) + for (i = n - 1; i >= 0; --i) { + nodes.push((child = node.children[i] = new TreeNode(children[i], i))) + child.parent = node + } + } + } + + ;(tree.parent = new TreeNode(null, 0)).children = [tree] + return tree +} + +// Node-link tree diagram using the Reingold-Tilford "tidy" algorithm +export default function () { + var separation = defaultSeparation, + dx = 1, + dy = 1, + nodeSize = null + + function tree(root) { + var t = treeRoot(root) + + // Compute the layout using Buchheim et al.’s algorithm. + t.eachAfter(firstWalk), (t.parent.m = -t.z) + t.eachBefore(secondWalk) + + // If a fixed node size is specified, scale x and y. + if (nodeSize) root.eachBefore(sizeNode) + // If a fixed tree size is specified, scale x and y based on the extent. + // Compute the left-most, right-most, and depth-most nodes for extents. + else { + var left = root, + right = root, + bottom = root + root.eachBefore(function (node) { + if (node.x < left.x) left = node + if (node.x > right.x) right = node + if (node.depth > bottom.depth) bottom = node + }) + var s = left === right ? 1 : separation(left, right) / 2, + tx = s - left.x, + kx = dx / (right.x + s + tx), + ky = dy / (bottom.depth || 1) + root.eachBefore(function (node) { + node.x = (node.x + tx) * kx + node.y = node.depth * ky + }) + } + + return root + } + + // Computes a preliminary x-coordinate for v. Before that, FIRST WALK is + // applied recursively to the children of v, as well as the function + // APPORTION. After spacing out the children by calling EXECUTE SHIFTS, the + // node v is placed to the midpoint of its outermost children. + function firstWalk(v) { + var children = v.children, + siblings = v.parent.children, + w = v.i ? siblings[v.i - 1] : null + if (children) { + executeShifts(v) + var midpoint = (children[0].z + children[children.length - 1].z) / 2 + if (w) { + v.z = w.z + separation(v._, w._) + v.m = v.z - midpoint + } else { + v.z = midpoint + } + } else if (w) { + v.z = w.z + separation(v._, w._) + } + v.parent.A = apportion(v, w, v.parent.A || siblings[0]) + } + + // Computes all real x-coordinates by summing up the modifiers recursively. + function secondWalk(v) { + v._.x = v.z + v.parent.m + v.m += v.parent.m + } + + // The core of the algorithm. Here, a new subtree is combined with the + // previous subtrees. Threads are used to traverse the inside and outside + // contours of the left and right subtree up to the highest common level. The + // vertices used for the traversals are vi+, vi-, vo-, and vo+, where the + // superscript o means outside and i means inside, the subscript - means left + // subtree and + means right subtree. For summing up the modifiers along the + // contour, we use respective variables si+, si-, so-, and so+. Whenever two + // nodes of the inside contours conflict, we compute the left one of the + // greatest uncommon ancestors using the function ANCESTOR and call MOVE + // SUBTREE to shift the subtree and prepare the shifts of smaller subtrees. + // Finally, we add a new thread (if necessary). + function apportion(v, w, ancestor) { + if (w) { + var vip = v, + vop = v, + vim = w, + vom = vip.parent.children[0], + sip = vip.m, + sop = vop.m, + sim = vim.m, + som = vom.m, + shift + while (((vim = nextRight(vim)), (vip = nextLeft(vip)), vim && vip)) { + vom = nextLeft(vom) + vop = nextRight(vop) + vop.a = v + shift = vim.z + sim - vip.z - sip + separation(vim._, vip._) + if (shift > 0) { + moveSubtree(nextAncestor(vim, v, ancestor), v, shift) + sip += shift + sop += shift + } + sim += vim.m + sip += vip.m + som += vom.m + sop += vop.m + } + if (vim && !nextRight(vop)) { + vop.t = vim + vop.m += sim - sop + } + if (vip && !nextLeft(vom)) { + vom.t = vip + vom.m += sip - som + ancestor = v + } + } + return ancestor + } + + function sizeNode(node) { + node.x *= dx + node.y = node.depth * dy + } + + tree.separation = function (x) { + return arguments.length ? ((separation = x), tree) : separation + } + + tree.size = function (x) { + return arguments.length ? ((nodeSize = false), (dx = +x[0]), (dy = +x[1]), tree) : nodeSize ? null : [dx, dy] + } + + tree.nodeSize = function (x) { + return arguments.length ? ((nodeSize = true), (dx = +x[0]), (dy = +x[1]), tree) : nodeSize ? [dx, dy] : null + } + + return tree +} diff --git a/src/layout/hierarchy/utils.ts b/src/layout/hierarchy/utils.ts new file mode 100644 index 00000000..f22050d9 --- /dev/null +++ b/src/layout/hierarchy/utils.ts @@ -0,0 +1,94 @@ +import { HierarchyPointNode } from 'd3-hierarchy' +import type { Node } from '../../trellis' + +// types +export type Hierarchy = { id: string; children: Hierarchy[] } + +export type SeparationFn = (a: HierarchyPointNode, b: HierarchyPointNode) => number + +// utils +const _graphToDFSHierarchy = (edgeIndex: Record, id: string, visited: Set): Hierarchy => { + visited.add(id) + + const children: Hierarchy[] = [] + + for (const child of edgeIndex[id]) { + if (!visited.has(child)) { + children.push(_graphToDFSHierarchy(edgeIndex, child, visited)) + } + } + + return { id, children } +} + +export const graphToDFSHierarchy = (edgeIndex: Record, id: string): Hierarchy => + _graphToDFSHierarchy(edgeIndex, id, new Set()) + +export const graphToBFSHierarchy = (edgeIndex: Record, id: string): Hierarchy => { + const children: Hierarchy['children'] = [] + + const queue: (readonly [string, Hierarchy['children']])[] = [[id, children]] + + const visited = new Set([id]) + + while (queue.length > 0) { + const [id, children] = queue.shift()! + + for (const child of edgeIndex[id]) { + if (!visited.has(child)) { + visited.add(child) + const grandChildren: Hierarchy['children'] = [] + children.push({ id: child, children: grandChildren }) + queue.push([child, grandChildren] as const) + } + } + } + + return { + id, + children + } +} + +const _hierarchyToGraph = ( + hierarchy: HierarchyPointNode, + nodesById: Record | undefined> +) => { + nodesById[hierarchy.data.id] = hierarchy + + if (hierarchy.children !== undefined) { + for (const child of hierarchy.children) { + _hierarchyToGraph(child, nodesById) + } + } + + return nodesById +} + +export const hierarchyToGraph = (hierarchy: HierarchyPointNode) => _hierarchyToGraph(hierarchy, {}) + +export const containsSubgraphNode = (nodes: Node[], id: string): boolean => { + for (const node of nodes) { + if (node.id === id) return true + + if (node.subgraph !== undefined) { + const exists = containsSubgraphNode(node.subgraph.nodes, id) + if (exists) return true + } + } + + return false +} + +export const findAncestor = (nodes: Node[], id: string): string | undefined => { + for (const node of nodes) { + if (node.id === id) return node.id + + if (node.subgraph !== undefined) { + const exists = containsSubgraphNode(node.subgraph.nodes, id) + if (exists) return node.id + } + } + + return undefined +} From 310b6cb348a84714f836f8075ad77c8a2869ef30 Mon Sep 17 00:00:00 2001 From: Mikey Gower Date: Thu, 14 Sep 2023 16:25:50 -0400 Subject: [PATCH 02/22] enable min/mid/max alignment and left position in hierarchy --- src/layout/hierarchy/index.ts | 42 +++++++++++++++++----------- src/layout/hierarchy/tree/index.d.ts | 6 +++- src/layout/hierarchy/tree/index.js | 22 ++++++++++++--- src/layout/hierarchy/utils.ts | 2 -- 4 files changed, 48 insertions(+), 24 deletions(-) diff --git a/src/layout/hierarchy/index.ts b/src/layout/hierarchy/index.ts index ad1181e5..367ef989 100644 --- a/src/layout/hierarchy/index.ts +++ b/src/layout/hierarchy/index.ts @@ -1,6 +1,6 @@ -import type { Node, Edge } from '../../trellis' -import { findAncestor, hierarchyToGraph, graphToBFSHierarchy, graphToDFSHierarchy, SeparationFn, Hierarchy } from './utils' -import { hierarchy } from 'd3-hierarchy' +import type { Node, Edge, Placement } from '../../trellis' +import { findAncestor, hierarchyToGraph, graphToBFSHierarchy, graphToDFSHierarchy, Hierarchy } from './utils' +import { HierarchyPointNode, hierarchy } from 'd3-hierarchy' import tree from './tree' export type Options = Partial<{ @@ -8,8 +8,10 @@ export type Options = Partial<{ y: number nodeSize: [number, number] size: [number, number] - separation: SeparationFn + separation: (a: HierarchyPointNode, b: HierarchyPointNode) => number bfs: boolean + anchor: Placement + alignment: 'min' | 'mid' | 'max' }> export const DEFAULT_NODE_SIZE: [number, number] = [120, 240] @@ -45,29 +47,35 @@ export const Layout = () => { layout.separation(graph.options.separation) } + if (graph.options?.alignment !== undefined) { + layout.alignment(graph.options.alignment) + } + const positionedDataById = hierarchyToGraph( layout(hierarchy(graph.options?.bfs !== false ? graphToBFSHierarchy(edgeIndex, root) : graphToDFSHierarchy(edgeIndex, root))) ) - const { x, y } = graph.nodes.find((node) => node.id === rootId) ?? { - x: undefined, - y: undefined - } - const xOffset = (graph.options?.x ?? 0) + (x ?? 0) - const yOffset = (graph.options?.y ?? 0) - (y ?? 0) + const { x = 0, y = 0 } = graph.nodes.find((node) => node.id === rootId) ?? {} + + const xOffset = (graph.options?.x ?? 0) + x + const yOffset = (graph.options?.y ?? 0) - y return { edges: graph.edges, nodes: graph.nodes.map((node) => { const positionedNode = positionedDataById[node.id] - return positionedNode === undefined - ? node - : { - ...node, - x: positionedNode.x + xOffset, - y: positionedNode.y - yOffset - } + if (positionedNode !== undefined) { + const x = positionedNode.x + xOffset + const y = positionedNode.y - yOffset + if (graph.options?.anchor === 'left') { + return { ...node, y: x, x: y } + } else { + return { ...node, x, y } + } + } + + return node }) } } diff --git a/src/layout/hierarchy/tree/index.d.ts b/src/layout/hierarchy/tree/index.d.ts index 4f59a965..e5190b13 100644 --- a/src/layout/hierarchy/tree/index.d.ts +++ b/src/layout/hierarchy/tree/index.d.ts @@ -1,3 +1,7 @@ -import { TreeLayout } from 'd3-hierarchy' +import { TreeLayout as HierarchyTreeLayout } from 'd3-hierarchy' import { Hierarchy } from '../utils' + +interface TreeLayout extends HierarchyTreeLayout { + alignment: (alignment: 'min' | 'max' | 'mid') => this +} export default function (): TreeLayout diff --git a/src/layout/hierarchy/tree/index.js b/src/layout/hierarchy/tree/index.js index ba90e0a3..8d0b4331 100644 --- a/src/layout/hierarchy/tree/index.js +++ b/src/layout/hierarchy/tree/index.js @@ -101,7 +101,8 @@ export default function () { var separation = defaultSeparation, dx = 1, dy = 1, - nodeSize = null + nodeSize = null, + alignment = 'mid' function tree(root) { var t = treeRoot(root) @@ -146,12 +147,20 @@ export default function () { w = v.i ? siblings[v.i - 1] : null if (children) { executeShifts(v) - var midpoint = (children[0].z + children[children.length - 1].z) / 2 + var point + if (alignment === 'min') { + point = Math.min(children[0].z, children[children.length - 1].z) + } else if (alignment === 'max') { + point = Math.max(children[0].z, children[children.length - 1].z) + } else { + point = (children[0].z + children[children.length - 1].z) / 2 + } + if (w) { v.z = w.z + separation(v._, w._) - v.m = v.z - midpoint + v.m = v.z - point } else { - v.z = midpoint + v.z = point } } else if (w) { v.z = w.z + separation(v._, w._) @@ -232,5 +241,10 @@ export default function () { return arguments.length ? ((nodeSize = true), (dx = +x[0]), (dy = +x[1]), tree) : nodeSize ? [dx, dy] : null } + tree.alignment = function (x) { + alignment = x + return tree + } + return tree } diff --git a/src/layout/hierarchy/utils.ts b/src/layout/hierarchy/utils.ts index f22050d9..271c7113 100644 --- a/src/layout/hierarchy/utils.ts +++ b/src/layout/hierarchy/utils.ts @@ -4,8 +4,6 @@ import type { Node } from '../../trellis' // types export type Hierarchy = { id: string; children: Hierarchy[] } -export type SeparationFn = (a: HierarchyPointNode, b: HierarchyPointNode) => number - // utils const _graphToDFSHierarchy = (edgeIndex: Record, id: string, visited: Set): Hierarchy => { visited.add(id) From 9e8ceb7e236cbb22a612c8f735e74d18f67c422d Mon Sep 17 00:00:00 2001 From: Mikey Gower Date: Fri, 15 Sep 2023 12:03:39 -0400 Subject: [PATCH 03/22] include layout example for left anchored hierarchy --- examples/index.html | 3 +- .../{hierarchy => left-hierarchy}/index.html | 0 examples/left-hierarchy/index.ts | 228 ++++++++++++++++++ examples/top-hierarchy/index.html | 24 ++ .../{hierarchy => top-hierarchy}/index.ts | 2 +- 5 files changed, 255 insertions(+), 2 deletions(-) rename examples/{hierarchy => left-hierarchy}/index.html (100%) create mode 100644 examples/left-hierarchy/index.ts create mode 100644 examples/top-hierarchy/index.html rename examples/{hierarchy => top-hierarchy}/index.ts (99%) diff --git a/examples/index.html b/examples/index.html index 9414df4d..f7dc3705 100644 --- a/examples/index.html +++ b/examples/index.html @@ -24,7 +24,8 @@
  • pixi subgraphs
  • pixi react
  • pixi icons
  • -
  • hierarchy
  • +
  • top hierarchy
  • +
  • left hierarchy
  • radial
  • collide
  • components
  • diff --git a/examples/hierarchy/index.html b/examples/left-hierarchy/index.html similarity index 100% rename from examples/hierarchy/index.html rename to examples/left-hierarchy/index.html diff --git a/examples/left-hierarchy/index.ts b/examples/left-hierarchy/index.ts new file mode 100644 index 00000000..fcf516f4 --- /dev/null +++ b/examples/left-hierarchy/index.ts @@ -0,0 +1,228 @@ +import Stats from 'stats.js' +import * as Hierarchy from '../../src/layout/hierarchy' +import * as Graph from '../../src' +import * as Zoom from '../../src/bindings/native/zoom' +import * as WebGL from '../../src/renderers/webgl' +import graphData from '../../data/tmp-data' + +export const stats = new Stats() +stats.showPanel(0) // 0: fps, 1: ms, 2: mb, 3+: custom +document.body.appendChild(stats.dom) + +/** + * Initialize Data + */ +type Node = Graph.Node & { type: string } + +const arabicLabel = 'مدالله بن علي\nبن سهل الخالدي' +const thaiLabel = 'บริษัท ไทยยูเนียนรับเบอร์\nจำกัด' +const russianLabel = 'ВИКТОР ФЕЛИКСОВИЧ ВЕКСЕЛЬБЕРГ' + +const createCompanyStyle = (radius: number): Graph.NodeStyle => ({ + color: '#FFAF1D', + stroke: [{ color: '#FFF' }, { color: '#F7CA4D' }], + label: { placement: 'right' }, + icon: { + type: 'textIcon' as const, + family: 'Material Icons', + text: 'business', + color: '#fff', + size: radius * 1.2 + }, + badge: [ + { + position: 45, + color: '#FFAF1D', + stroke: '#FFF', + icon: { type: 'textIcon', family: 'Helvetica', size: 10, color: '#FFF', text: '15' } + }, + { + position: 135, + color: '#E4171B', + stroke: '#FFF', + icon: { type: 'textIcon', family: 'Helvetica', size: 10, color: '#FFF', text: '!' } + } + ] +}) + +const createPersonStyle = (radius: number): Graph.NodeStyle => ({ + color: '#7CBBF3', + stroke: [{ color: '#90D7FB' }], + label: { placement: 'right' }, + icon: { + type: 'textIcon' as const, + family: 'Material Icons', + text: 'person', + color: '#fff', + size: radius * 1.2 + }, + badge: [ + { + position: 45, + color: '#7CBBF3', + stroke: '#FFF', + icon: { type: 'textIcon', family: 'Helvetica', size: 10, color: '#FFF', text: '8' } + } + ] +}) + +let nodes = Object.values(graphData.nodes) + .map((node, idx) => ({ + ...node, + label: idx % 4 === 0 ? arabicLabel : idx % 4 === 1 ? thaiLabel : idx % 4 === 2 ? russianLabel : node.label + })) + .concat(Object.values(graphData.nodes).map((node) => ({ ...node, id: `${node.id}_2` }))) + .concat(Object.values(graphData.nodes).map((node) => ({ ...node, id: `${node.id}_3` }))) + .map(({ id, label, type }) => ({ + id, + label, + radius: 18, + type, + style: type === 'company' ? createCompanyStyle(18) : createPersonStyle(18) + })) + +let edges = Object.entries<{ field: string; source: string; target: string }>(graphData.edges) + .concat( + Object.entries(graphData.edges).map(([id, edge]) => [`${id}_2`, { ...edge, source: `${edge.source}_2`, target: `${edge.target}_2` }]) + ) + .concat( + Object.entries(graphData.edges).map(([id, edge]) => [`${id}_3`, { ...edge, source: `${edge.source}_3`, target: `${edge.target}_3` }]) + ) + .concat([ + [ + 'connect_2', + { + field: 'related_to', + source: Object.values(graphData.nodes)[77].id, + target: `${Object.values(graphData.nodes)[0].id}_2` + } + ], + [ + 'connect_3', + { + field: 'related_to', + source: `${Object.values(graphData.nodes)[50].id}_2`, + target: `${Object.values(graphData.nodes)[0].id}_3` + } + ] + ]) + .map(([id, { field, source, target }]) => ({ + id, + source, + target, + label: field.replace(/_/g, ' '), + style: { arrow: 'forward' } + })) +/** + * Initialize Layout and Renderer + */ +const container = document.querySelector('#graph') as HTMLDivElement +const hierarchy = Hierarchy.Layout() +const zoomControl = Zoom.Control({ container }) +const render = WebGL.Renderer({ + container, + debug: { stats, logPerformance: false } +}) + +/** + * Initialize Layout and Renderer Options + */ + +let index = 0 +const root = nodes[0].id +const size = { width: container.offsetWidth, height: container.offsetHeight } +const options: Hierarchy.Options = { x: 600, y: size.width, nodeSize: [50, 600], anchor: 'left' } +const data = [ + hierarchy(root, { nodes, edges, options: { ...options, alignment: 'min' } }), + hierarchy(root, { nodes, edges, options: { ...options, alignment: 'mid' } }), + hierarchy(root, { nodes, edges, options: { ...options, alignment: 'max' } }) +] +const viewport = data.map((graph) => Graph.boundsToViewport(Graph.getSelectionBounds(graph.nodes, 120), size)) + +const renderOptions: WebGL.Options = { + ...size, + x: 0, + y: 0, + zoom: 1, + minZoom: 0.1, + maxZoom: 2.5, + onNodeDrag: ({ nodeX: x, nodeY: y, target: { id } }) => { + nodes = nodes.map((node) => (node.id === id ? { ...node, x, y } : node)) + render({ nodes, edges, options: renderOptions }) + }, + onNodePointerEnter: ({ target: { id } }) => { + nodes = nodes.map((node) => + node.id === id + ? { + ...node, + style: { + ...node.style, + stroke: node.type === 'company' ? [{ color: '#FFF' }, { color: '#CCC' }] : [{ color: '#CCC' }] + } + } + : node + ) + render({ nodes, edges, options: renderOptions }) + }, + onNodePointerLeave: ({ target: { id } }) => { + nodes = nodes.map((node) => + node.id === id + ? { + ...node, + style: node.type === 'company' ? createCompanyStyle(18) : createPersonStyle(18) + } + : node + ) + render({ nodes, edges, options: renderOptions }) + }, + onEdgePointerEnter: ({ target: { id } }) => { + edges = edges.map((edge) => (edge.id === id ? { ...edge, style: { ...edge.style, width: 3 } } : edge)) + render({ nodes, edges, options: renderOptions }) + }, + onEdgePointerLeave: ({ target: { id } }) => { + edges = edges.map((edge) => (edge.id === id ? { ...edge, style: { ...edge.style, width: 1 } } : edge)) + render({ nodes, edges, options: renderOptions }) + }, + onViewportPointerDown: () => { + index = index === data.length - 1 ? 0 : index + 1 + nodes = data[index].nodes + edges = data[index].edges + renderOptions.x = viewport[index].x + renderOptions.y = viewport[index].y + renderOptions.zoom = viewport[index].zoom + render({ nodes, edges, options: renderOptions }) + }, + onViewportDrag: ({ viewportX, viewportY }) => { + renderOptions.x = viewportX + renderOptions.y = viewportY + render({ nodes, edges, options: renderOptions }) + }, + onViewportWheel: ({ viewportX, viewportY, viewportZoom }) => { + renderOptions.x = viewportX + renderOptions.y = viewportY + renderOptions.zoom = viewportZoom + render({ nodes, edges, options: renderOptions }) + } +} + +/** + * Layout and Render Graph + */ +zoomControl({ + top: 80, + onZoomIn: () => { + renderOptions.zoom = Zoom.clampZoom(renderOptions.minZoom!, renderOptions.maxZoom!, renderOptions.zoom! / 0.6) + render({ nodes, edges, options: renderOptions }) + }, + onZoomOut: () => { + renderOptions.zoom = Zoom.clampZoom(renderOptions.minZoom!, renderOptions.maxZoom!, renderOptions.zoom! * 0.6) + render({ nodes, edges, options: renderOptions }) + } +}) + +nodes = data[index].nodes +edges = data[index].edges +renderOptions.x = viewport[index].x +renderOptions.y = viewport[index].y +renderOptions.zoom = viewport[index].zoom +render({ nodes, edges, options: renderOptions }) diff --git a/examples/top-hierarchy/index.html b/examples/top-hierarchy/index.html new file mode 100644 index 00000000..ef1eb2df --- /dev/null +++ b/examples/top-hierarchy/index.html @@ -0,0 +1,24 @@ + + + + + Graph + + + + + + +
    + + + diff --git a/examples/hierarchy/index.ts b/examples/top-hierarchy/index.ts similarity index 99% rename from examples/hierarchy/index.ts rename to examples/top-hierarchy/index.ts index 390585cd..72f96300 100644 --- a/examples/hierarchy/index.ts +++ b/examples/top-hierarchy/index.ts @@ -1,7 +1,7 @@ import Stats from 'stats.js' import * as Hierarchy from '../../src/layout/hierarchy' import * as Force from '../../src/layout/force' -import * as Graph from '../../src/' +import * as Graph from '../../src' import * as Zoom from '../../src/bindings/native/zoom' import * as WebGL from '../../src/renderers/webgl' import graphData from '../../data/tmp-data' From 5f19de5e82f5c4f6448d193d4b7e7514d8541d4d Mon Sep 17 00:00:00 2001 From: Mikey Gower Date: Tue, 19 Sep 2023 15:04:24 -0400 Subject: [PATCH 04/22] enable right/bottom anchor positioning in hierarchy layout --- src/layout/hierarchy/index.ts | 42 ++++++++++++++++++++++------------- 1 file changed, 27 insertions(+), 15 deletions(-) diff --git a/src/layout/hierarchy/index.ts b/src/layout/hierarchy/index.ts index 367ef989..0da5adfa 100644 --- a/src/layout/hierarchy/index.ts +++ b/src/layout/hierarchy/index.ts @@ -17,7 +17,7 @@ export type Options = Partial<{ export const DEFAULT_NODE_SIZE: [number, number] = [120, 240] export const Layout = () => { - return (rootId: string, graph: { nodes: N[]; edges: E[]; options?: Options }) => { + return (_root: string, graph: { nodes: N[]; edges: E[]; options?: Options }) => { const edgeIndex = graph.edges.reduce>((edgeIndex, edge) => { if (edgeIndex[edge.source] === undefined) { edgeIndex[edge.source] = [] @@ -32,16 +32,21 @@ export const Layout = () => { return edgeIndex }, {}) - const root = edgeIndex[rootId] === undefined ? findAncestor(graph.nodes, rootId) ?? rootId : rootId + const rootId = edgeIndex[_root] === undefined ? findAncestor(graph.nodes, _root) ?? _root : _root - if (edgeIndex[root] === undefined) { + if (edgeIndex[rootId] === undefined) { return { nodes: graph.nodes, edges: graph.edges } } - const layout = - graph.options?.size !== undefined - ? tree().size(graph.options.size) - : tree().nodeSize(graph.options?.nodeSize ?? DEFAULT_NODE_SIZE) + const root = hierarchy(graph.options?.bfs !== false ? graphToBFSHierarchy(edgeIndex, rootId) : graphToDFSHierarchy(edgeIndex, rootId)) + const layout = tree() + + const nodeSize = graph.options?.nodeSize ?? DEFAULT_NODE_SIZE + if (graph.options?.size !== undefined) { + layout.size(graph.options.size) + } else { + layout.nodeSize(nodeSize) + } if (graph.options?.separation !== undefined) { layout.separation(graph.options.separation) @@ -51,11 +56,9 @@ export const Layout = () => { layout.alignment(graph.options.alignment) } - const positionedDataById = hierarchyToGraph( - layout(hierarchy(graph.options?.bfs !== false ? graphToBFSHierarchy(edgeIndex, root) : graphToDFSHierarchy(edgeIndex, root))) - ) + const positionedDataById = hierarchyToGraph(layout(root)) - const { x = 0, y = 0 } = graph.nodes.find((node) => node.id === rootId) ?? {} + const { x = 0, y = 0 } = graph.nodes.find((node) => node.id === _root) ?? {} const xOffset = (graph.options?.x ?? 0) + x const yOffset = (graph.options?.y ?? 0) - y @@ -68,10 +71,19 @@ export const Layout = () => { if (positionedNode !== undefined) { const x = positionedNode.x + xOffset const y = positionedNode.y - yOffset - if (graph.options?.anchor === 'left') { - return { ...node, y: x, x: y } - } else { - return { ...node, x, y } + switch (graph.options?.anchor) { + case 'left': + // rotate tree 90 degrees by replacing x and y + return { ...node, y: x, x: y } + case 'right': + // rotate tree 90 degrees and flip on x axis by offsetting with tree width + return { ...node, y: x, x: root.height * nodeSize[1] - y } + case 'bottom': + // flip on y axis by offsetting with tree height + return { ...node, x, y: root.height * nodeSize[0] - y } + default: + // default to top + return { ...node, x, y } } } From 9f92aca8e1fa4f866cd574fd27c41d257836f6c3 Mon Sep 17 00:00:00 2001 From: Mikey Gower Date: Tue, 19 Sep 2023 15:22:54 -0400 Subject: [PATCH 05/22] update hierarchy examples with all anchor positions and alignment --- examples/hierarchy/data.ts | 3404 +++++++++++++++++ .../{left-hierarchy => hierarchy}/index.html | 0 .../{left-hierarchy => hierarchy}/index.ts | 25 +- examples/index.html | 3 +- examples/top-hierarchy/index.html | 24 - examples/top-hierarchy/index.ts | 260 -- 6 files changed, 3420 insertions(+), 296 deletions(-) create mode 100644 examples/hierarchy/data.ts rename examples/{left-hierarchy => hierarchy}/index.html (100%) rename examples/{left-hierarchy => hierarchy}/index.ts (82%) delete mode 100644 examples/top-hierarchy/index.html delete mode 100644 examples/top-hierarchy/index.ts diff --git a/examples/hierarchy/data.ts b/examples/hierarchy/data.ts new file mode 100644 index 00000000..737aabc4 --- /dev/null +++ b/examples/hierarchy/data.ts @@ -0,0 +1,3404 @@ +export default [ + { + source: 'i1D5ub-15RRb0Omyik4LMQ', + source_type: 'company', + source_label: 'POUCHEN VIETNAM ENTERPRISE .LTD', + target: '875yxpVvxV2RsweKMRiu7g', + target_type: 'company', + target_label: 'NIKE USA, INC.', + field: 'ships_to' + }, + { + source: 'ghSsFkTP63LNCtklRVteUA', + source_type: 'company', + source_label: 'Công Ty TNHH Đông Tây Tây Nguyên', + target: 'i1D5ub-15RRb0Omyik4LMQ', + target_type: 'company', + target_label: 'POUCHEN VIETNAM ENTERPRISE .LTD', + field: 'ships_to' + }, + { + source: 'JBs_ElZzH-PQIG8Sm3fBaQ', + source_type: 'person', + source_label: 'CONG TY CHANG SHIN VIET NAM TRACH NHIEM HUU HAN', + target: 'ghSsFkTP63LNCtklRVteUA', + target_type: 'company', + target_label: 'Công Ty TNHH Đông Tây Tây Nguyên', + field: 'ships_to' + }, + { + source: 'y4qWGNbfS4u6qB0a_Ztx0w', + source_type: 'company', + source_label: 'CôNG TY TNHH SAMBU FINE VIệT NAM', + target: 'i1D5ub-15RRb0Omyik4LMQ', + target_type: 'company', + target_label: 'POUCHEN VIETNAM ENTERPRISE .LTD', + field: 'ships_to' + }, + { + source: '-g7pbHTY4DWohGGDPGHlSg', + source_type: 'company', + source_label: 'TECHNICK PRODUCTS INC', + target: 'y4qWGNbfS4u6qB0a_Ztx0w', + target_type: 'company', + target_label: 'CôNG TY TNHH SAMBU FINE VIệT NAM', + field: 'ships_to' + }, + { + source: 'POJMUJZTx3tRdR64UUiJJg', + source_type: 'company', + source_label: 'SUNKIST CHEMICAL MACHINERY LTD', + target: 'y4qWGNbfS4u6qB0a_Ztx0w', + target_type: 'company', + target_label: 'CôNG TY TNHH SAMBU FINE VIệT NAM', + field: 'ships_to' + }, + { + source: 'JdWlfTGPr2V9qR8KcTzpqg', + source_type: 'company', + source_label: 'GTM-KOREA', + target: 'y4qWGNbfS4u6qB0a_Ztx0w', + target_type: 'company', + target_label: 'CôNG TY TNHH SAMBU FINE VIệT NAM', + field: 'ships_to' + }, + { + source: '1psWQQT8trJieu_8LaJ1oQ', + source_type: 'company', + source_label: 'NINGBO YONGTAM INTERNATIONAL TRADE CO.,LTD', + target: 'y4qWGNbfS4u6qB0a_Ztx0w', + target_type: 'company', + target_label: 'CôNG TY TNHH SAMBU FINE VIệT NAM', + field: 'ships_to' + }, + { + source: 'PMS7vApODXt0LukTgFeLdg', + source_type: 'company', + source_label: 'CôNG TY TNHH MAXPORT LIMITED (VIET NAM)', + target: '875yxpVvxV2RsweKMRiu7g', + target_type: 'company', + target_label: 'NIKE USA, INC.', + field: 'ships_to' + }, + { + source: '23vQxJdeBrvwq5UgIHOnPw', + source_type: 'company', + source_label: 'ARCTERYX EQUIPMENT', + target: 'PMS7vApODXt0LukTgFeLdg', + target_type: 'company', + target_label: 'CôNG TY TNHH MAXPORT LIMITED (VIET NAM)', + field: 'ships_to' + }, + { + source: 'KiRkgkNcc1g8_tvQ3q-gPQ', + source_type: 'company', + source_label: 'MOL CONSOLIDATION SERVICES FOR AND NYG (VIETNAM) CO.,LTD', + target: '23vQxJdeBrvwq5UgIHOnPw', + target_type: 'company', + target_label: 'ARCTERYX EQUIPMENT', + field: 'ships_to' + }, + { + source: 'Be1vdQekKL83u9Aq_rEWFw', + source_type: 'company', + source_label: 'ECLAT TEXTILE CO., LTD', + target: 'PMS7vApODXt0LukTgFeLdg', + target_type: 'company', + target_label: 'CôNG TY TNHH MAXPORT LIMITED (VIET NAM)', + field: 'ships_to' + }, + { + source: 'R1DOkA8k_SslHRr7d-rW3A', + source_type: 'company', + source_label: 'CôNG TY TRáCH NHIệM HữU HạN THế HUY', + target: 'Be1vdQekKL83u9Aq_rEWFw', + target_type: 'company', + target_label: 'ECLAT TEXTILE CO., LTD', + field: 'ships_to' + }, + { + source: 'aCy376RD81eZW0kjva_hlA', + source_type: 'company', + source_label: 'ASICS EUROPE BV', + target: 'PMS7vApODXt0LukTgFeLdg', + target_type: 'company', + target_label: 'CôNG TY TNHH MAXPORT LIMITED (VIET NAM)', + field: 'ships_to' + }, + { + source: 'BQy4ZlQ4Ba_yxU6EeoR98w', + source_type: 'company', + source_label: 'APL LOGISTICS CO LTD VIETNAM - HAIPH', + target: 'aCy376RD81eZW0kjva_hlA', + target_type: 'company', + target_label: 'ASICS EUROPE BV', + field: 'ships_to' + }, + { + source: '8WWpvOzf3kfMcBDXnM9n6g', + source_type: 'company', + source_label: 'APL LOGISTICS VIETNAM CO LTD', + target: 'aCy376RD81eZW0kjva_hlA', + target_type: 'company', + target_label: 'ASICS EUROPE BV', + field: 'ships_to' + }, + { + source: 'gnj8PTONC4yEeG-OCRHluA', + source_type: 'company', + source_label: 'PT. CHANGSHIN REKSA JAYA', + target: '875yxpVvxV2RsweKMRiu7g', + target_type: 'company', + target_label: 'NIKE USA, INC.', + field: 'ships_to' + }, + { + source: 'dPiJDJTIuGz9yhg4PDWIrg', + source_type: 'company', + source_label: 'Công Ty TNHH Chang Yang Việt Nam', + target: 'gnj8PTONC4yEeG-OCRHluA', + target_type: 'company', + target_label: 'PT. CHANGSHIN REKSA JAYA', + field: 'ships_to' + }, + { + source: 'klHscKfwfgOTEWSG3YC-ig', + source_type: 'company', + source_label: 'EVER BRAVE DEVELOPMENTS LTD TAIWAN BRANCH/ECLIPSE POLYMERS (HK) CO LTD', + target: 'dPiJDJTIuGz9yhg4PDWIrg', + target_type: 'company', + target_label: 'Công Ty TNHH Chang Yang Việt Nam', + field: 'ships_to' + }, + { + source: 'cvCrEjCivX7bNFgIR9-1EA', + source_type: 'company', + source_label: 'COMPUNIC ELECTRONICS CO., LTD.', + target: 'dPiJDJTIuGz9yhg4PDWIrg', + target_type: 'company', + target_label: 'Công Ty TNHH Chang Yang Việt Nam', + field: 'ships_to' + }, + { + source: 'QLeRj9ePjQVmikelvTOMwQ', + source_type: 'company', + source_label: 'LASTING POWER TRADING CO', + target: 'dPiJDJTIuGz9yhg4PDWIrg', + target_type: 'company', + target_label: 'Công Ty TNHH Chang Yang Việt Nam', + field: 'ships_to' + }, + { + source: '5hhhiPzZlqJSJ5BXco5wXA', + source_type: 'company', + source_label: 'MITSUBISHI CORPORATION (HONG KONG) LTD.', + target: 'dPiJDJTIuGz9yhg4PDWIrg', + target_type: 'company', + target_label: 'Công Ty TNHH Chang Yang Việt Nam', + field: 'ships_to' + }, + { + source: 'EkXfcRt7vCjrvBfUoksPkg', + source_type: 'company', + source_label: 'AIMEX INTERNATIONAL TRADING CO LTD', + target: 'dPiJDJTIuGz9yhg4PDWIrg', + target_type: 'company', + target_label: 'Công Ty TNHH Chang Yang Việt Nam', + field: 'ships_to' + }, + { + source: 'H3-64kgougl4rEF6_7J7rw', + source_type: 'company', + source_label: 'QATAR CHEMICAL AND PETROCHEMICAL MARKETING AND DISTRIBUTION (*)', + target: 'dPiJDJTIuGz9yhg4PDWIrg', + target_type: 'company', + target_label: 'Công Ty TNHH Chang Yang Việt Nam', + field: 'ships_to' + }, + { + source: 'E2EZ5I_h_TGoOxlfv9hAjw', + source_type: 'company', + source_label: 'SHUENN JAAN MACHINERY CO., LTD', + target: 'dPiJDJTIuGz9yhg4PDWIrg', + target_type: 'company', + target_label: 'Công Ty TNHH Chang Yang Việt Nam', + field: 'ships_to' + }, + { + source: '9hKkoEBuH6X7cHOPRzE3GQ', + source_type: 'company', + source_label: 'REN FENG LIMITED', + target: 'dPiJDJTIuGz9yhg4PDWIrg', + target_type: 'company', + target_label: 'Công Ty TNHH Chang Yang Việt Nam', + field: 'ships_to' + }, + { + source: 'm6aPsiZTOBdY4WfkNH-BHg', + source_type: 'company', + source_label: 'YULS HK INDUSTRIAL LIMITED', + target: 'dPiJDJTIuGz9yhg4PDWIrg', + target_type: 'company', + target_label: 'Công Ty TNHH Chang Yang Việt Nam', + field: 'ships_to' + }, + { + source: 'cQacKDxiKDfEz9ccVhvNzw', + source_type: 'company', + source_label: 'EVER BRAVE DEVELOPMENTS LTD TAIWAN BRANCH/DINH LU PLASTIC CO., LTD', + target: 'dPiJDJTIuGz9yhg4PDWIrg', + target_type: 'company', + target_label: 'Công Ty TNHH Chang Yang Việt Nam', + field: 'ships_to' + }, + { + source: 'Lzk9y47W4skMWMmCmSaxyw', + source_type: 'company', + source_label: 'Công ty TNHH YOUNG IL Việt Nam', + target: 'gnj8PTONC4yEeG-OCRHluA', + target_type: 'company', + target_label: 'PT. CHANGSHIN REKSA JAYA', + field: 'ships_to' + }, + { + source: '1ebalxTiNs_p4mb5qGAHug', + source_type: 'company', + source_label: 'FGL INTERNATIONAL S. P. A.', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 'pd45w5GqSTUbFZq42JuWKg', + source_type: 'company', + source_label: 'EQUITAN SRL', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 'S-AsctZu-oDuGSumvEc-5A', + source_type: 'person', + source_label: 'LS TONGSANG', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 'olMFadp_CTIgGwXYind68Q', + source_type: 'company', + source_label: 'DONG WOO CHEMTECH CO., LTD', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 'el0Do8um5HrQcUf8rV1G3g', + source_type: 'company', + source_label: 'AC HOTEL BY MARRIOTT BOSTON CLEVELAND CIRCLE', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 'vHau25FEFlzZzTqRVjukIg', + source_type: 'company', + source_label: 'A.T.C ( ASSISTANCE TECHNIQUE ET COMMERCIAL)', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 'fwe-TOC3f0c4c3fSYmFGmA', + source_type: 'company', + source_label: 'A.T.C TANNERY CHEMICALS', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 'knHYjD7bT29xX1lO2kTkxw', + source_type: 'company', + source_label: 'NEO TECH CO.', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: '3nyeedrH62MsXKk2j8YRMA', + source_type: 'company', + source_label: 'BU KYOUNG TEC CO., LTD', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 'VmrMLHCh7NECiXmuc-rkuA', + source_type: 'company', + source_label: 'ALCOVER QUIMICA SL.', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 'NGUZSdZSsvJqD6DBlQdLgw', + source_type: 'company', + source_label: 'SUNG NAM CO., LTD', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 'GNz-vrdyVqflnF-SeOUnbg', + source_type: 'company', + source_label: 'TAEKYUNG TRADING CO.', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 'UlUWhLXO9R64VoCgtiHxWw', + source_type: 'company', + source_label: 'MARIO CAIMI S.R.L', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 'ta2EhlFaGMUF1bTG7LNWqA', + source_type: 'company', + source_label: 'TANKEM-KOREA CO., LTD', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: '282TIh5c-Qq8zfAog6vNag', + source_type: 'company', + source_label: 'TENGDA TECHNOLOGY CO LIMITED', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: '66lUH5a5Zqb7Q9Wpi7T-6Q', + source_type: 'company', + source_label: 'FENCOLOR ITALIA S.R.L', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 'lW3QtemBDSMqiWUe3fIlaQ', + source_type: 'company', + source_label: 'COSO ELECTRONIC TECH CO., LTD', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 'ffAYpBBdqQsmIQBMRPE-RQ', + source_type: 'company', + source_label: 'SOCIETA ESERCIZIO STABILIMENTI NERINI S.R.L', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 'pMqpxrY7mgJSioNgNU1N6Q', + source_type: 'company', + source_label: 'TAE LIM DNC CO., LTD', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: '9ZhgLEuCTs-wW3Orly_odw', + source_type: 'company', + source_label: 'YOUNG IL LEATHER CO.,LTD', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 'WkiZy5SfYgzJOoPteLA1dw', + source_type: 'company', + source_label: 'TURNER SAS', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 'HxoiJEiDhf6pQ4nhi37YRg', + source_type: 'company', + source_label: 'JH CHEM TEC CO.,', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: '-gYlix9xK1eDbGG8qETaEA', + source_type: 'company', + source_label: 'JAGOTECH PAPER GMBH', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 'roQpysn4azNS9pyQ8BTnow', + source_type: 'company', + source_label: 'ZSIVIRA CHEMIE MERK PRIVATE LIMITED', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 'OCyJWvQo-hdat5uJ5o6L8A', + source_type: 'company', + source_label: 'CHEMAX CO.,LTD', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 'x2RLaLir4snyobvYbXIH5w', + source_type: 'company', + source_label: 'HANDOK ONDUSTRIAL CO LTD', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 'Ikhd6ypAyWHq7iIBV9K0pQ', + source_type: 'person', + source_label: 'KATE SPADE', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 'Uv-2t36plCXa7c52M0v7qw', + source_type: 'company', + source_label: 'B&J CO.,LTD', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 'nFKUzoV_gQ3lpIFLeS-l9A', + source_type: 'company', + source_label: 'ITA CHEMICALS ASIA LIMITED', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 'dGYFStdpRWohUUqXGMfBdg', + source_type: 'company', + source_label: 'C & U CO., LTD.', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 'CyHkXmtCQRijTnwCeLA3Qg', + source_type: 'company', + source_label: 'SUNRISE LEATHER (HK) LIMITED', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 't7bfl1xS9SW19CzYwZP8Gg', + source_type: 'company', + source_label: 'C/O PIDILITE IND LTD', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 'XYqMZOqKJIZgc8Cy_3pw4g', + source_type: 'company', + source_label: 'RAINBOW CHEMICAL INDUSTRY LIMITED', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 'T_cvI28I3Fg6T7c__hDK4Q', + source_type: 'company', + source_label: 'HAN DOK INDUSTRIAL CO., LTD', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: '_XYeDy3YYxCDnOhwmB6Sdw', + source_type: 'company', + source_label: 'ZSCHIMMER AND SCHWARZ GMBH AND CO KG', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: '_UB7wBBc4n4MphQt4k7E2Q', + source_type: 'company', + source_label: 'CM TANNERY MACHINES S.P.A', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 'azscCWcJesc1YygnKI9Xdg', + source_type: 'company', + source_label: 'ALPA KOREA CO., LTD', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 'p7igP_hGw3NNHqbAe185Hw', + source_type: 'company', + source_label: 'KDIC CORPORATION', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 'ElVk9SO-3gvvYo191cSptw', + source_type: 'company', + source_label: 'Công Ty TNHH CHEN TAI (Việt Nam)', + target: 'gnj8PTONC4yEeG-OCRHluA', + target_type: 'company', + target_label: 'PT. CHANGSHIN REKSA JAYA', + field: 'ships_to' + }, + { + source: 'SkGcGAtqs1VCJmjWbBkO_g', + source_type: 'company', + source_label: 'CHEN TAI INTERNATIONAL INVESTMENT CO., LTD. TAIWAN BRANCH (SEYCHELLES)', + target: 'ElVk9SO-3gvvYo191cSptw', + target_type: 'company', + target_label: 'Công Ty TNHH CHEN TAI (Việt Nam)', + field: 'ships_to' + }, + { + source: 'rV-ZrqwTZRsbIqowJkgt8g', + source_type: 'company', + source_label: 'SUZHOU NON-SUCCESS EVERY CORE INTERNATIONAL TRADING CO.,LTD', + target: 'ElVk9SO-3gvvYo191cSptw', + target_type: 'company', + target_label: 'Công Ty TNHH CHEN TAI (Việt Nam)', + field: 'ships_to' + }, + { + source: 'CL11eC3OMS0BS3VCs0nIKA', + source_type: 'company', + source_label: 'SUNRISE PLASTIC LIMITED', + target: 'ElVk9SO-3gvvYo191cSptw', + target_type: 'company', + target_label: 'Công Ty TNHH CHEN TAI (Việt Nam)', + field: 'ships_to' + }, + { + source: '3LX0ZfFNgu8bsqLqUdfuyA', + source_type: 'person', + source_label: 'Cty TNHH Việt Nam Paiho', + target: 'gnj8PTONC4yEeG-OCRHluA', + target_type: 'company', + target_label: 'PT. CHANGSHIN REKSA JAYA', + field: 'ships_to' + }, + { + source: 'qVkukiH_KrMhdhmwT6xeWw', + source_type: 'company', + source_label: 'NANTONG EAST HEPTANOIC MACHINERY CO., LTD', + target: '3LX0ZfFNgu8bsqLqUdfuyA', + target_type: 'person', + target_label: 'Cty TNHH Việt Nam Paiho', + field: 'ships_to' + }, + { + source: 'rAh6nX7kpCEsiaVaBvqhRQ', + source_type: 'company', + source_label: 'HERNG FA INDUSTRIAL CO., LTD', + target: '3LX0ZfFNgu8bsqLqUdfuyA', + target_type: 'person', + target_label: 'Cty TNHH Việt Nam Paiho', + field: 'ships_to' + }, + { + source: 'qlpOYIna_IH3FFT9eL8bfg', + source_type: 'company', + source_label: 'PFT AUTOMA TIONTECHNOLOGY LIMITED', + target: '3LX0ZfFNgu8bsqLqUdfuyA', + target_type: 'person', + target_label: 'Cty TNHH Việt Nam Paiho', + field: 'ships_to' + }, + { + source: '3xmaHtPpxMVyzSuEDlgSLw', + source_type: 'company', + source_label: 'DONGGUAN TINCHIKWAN INTELLIGENT TECHNOLOGY CO., LTD.', + target: '3LX0ZfFNgu8bsqLqUdfuyA', + target_type: 'person', + target_label: 'Cty TNHH Việt Nam Paiho', + field: 'ships_to' + }, + { + source: '50b_fPJAZx21mqIuc3ozhQ', + source_type: 'company', + source_label: 'RENQIU FEIXING TEXTILE MACHINERY CO.,LTD', + target: '3LX0ZfFNgu8bsqLqUdfuyA', + target_type: 'person', + target_label: 'Cty TNHH Việt Nam Paiho', + field: 'ships_to' + }, + { + source: '7Xwsq2GkOKU4mIf8FE5Byg', + source_type: 'company', + source_label: 'CHUN YI YARN TWISTING CO.,LTD', + target: '3LX0ZfFNgu8bsqLqUdfuyA', + target_type: 'person', + target_label: 'Cty TNHH Việt Nam Paiho', + field: 'ships_to' + }, + { + source: 'y1oenfwLluo8usXEn02pMg', + source_type: 'company', + source_label: 'MAERSK LOGISTICS & SERVICES', + target: '875yxpVvxV2RsweKMRiu7g', + target_type: 'company', + target_label: 'NIKE USA, INC.', + field: 'ships_to' + }, + { + source: 'TKhJb22KI31C7fHW6SvGyQ', + source_type: 'person', + source_label: 'PHOENIIX', + target: 'y1oenfwLluo8usXEn02pMg', + target_type: 'company', + target_label: 'MAERSK LOGISTICS & SERVICES', + field: 'ships_to' + }, + { + source: 'jbv17LV73n26wjAXGBZFIw', + source_type: 'company', + source_label: 'DMARK METAL BUTTON COMPANY LIMITED', + target: 'TKhJb22KI31C7fHW6SvGyQ', + target_type: 'person', + target_label: 'PHOENIIX', + field: 'ships_to' + }, + { + source: '9LQYtiQJVqim0V81X0vM4A', + source_type: 'company', + source_label: 'QIDONG QIANFAN NEW MATERIAL CO.,LTD', + target: 'TKhJb22KI31C7fHW6SvGyQ', + target_type: 'person', + target_label: 'PHOENIIX', + field: 'ships_to' + }, + { + source: '7i5mdxfP2AdpzI-iKgQESw', + source_type: 'company', + source_label: 'DAMCO INDIA PRIVATE LIMITED', + target: 'y1oenfwLluo8usXEn02pMg', + target_type: 'company', + target_label: 'MAERSK LOGISTICS & SERVICES', + field: 'ships_to' + }, + { + source: '8UL-H_qWnNnOhZWS-IgbtA', + source_type: 'company', + source_label: 'Maersk Logistics & Services International A/S', + target: '7i5mdxfP2AdpzI-iKgQESw', + target_type: 'company', + target_label: 'DAMCO INDIA PRIVATE LIMITED', + field: 'ships_to' + }, + { + source: 'uqaLfEnnt4FtEAsTuFE4hg', + source_type: 'company', + source_label: 'N.C.JOHN & SONS (P) LTD', + target: '7i5mdxfP2AdpzI-iKgQESw', + target_type: 'company', + target_label: 'DAMCO INDIA PRIVATE LIMITED', + field: 'ships_to' + }, + { + source: 'xADXHpLuOkai9aTnY-496Q', + source_type: 'company', + source_label: 'CHINA ARTS INTERTRANS JIANGSU CO LTD', + target: '7i5mdxfP2AdpzI-iKgQESw', + target_type: 'company', + target_label: 'DAMCO INDIA PRIVATE LIMITED', + field: 'ships_to' + }, + { + source: 'oCKstOgrVbtKFFCt3uafrw', + source_type: 'company', + source_label: 'NINGBO RONGXIN ELECTRIC APPLIANCES CO LTD', + target: '7i5mdxfP2AdpzI-iKgQESw', + target_type: 'company', + target_label: 'DAMCO INDIA PRIVATE LIMITED', + field: 'ships_to' + }, + { + source: '6gYDDgHxQFvOuTnrAU0-fA', + source_type: 'company', + source_label: 'KORMAN SHIPPING CO LTD', + target: 'y1oenfwLluo8usXEn02pMg', + target_type: 'company', + target_label: 'MAERSK LOGISTICS & SERVICES', + field: 'ships_to' + }, + { + source: '92gqinQQjQutkxVVWQsocw', + source_type: 'person', + source_label: 'SFT GONDRAND', + target: '6gYDDgHxQFvOuTnrAU0-fA', + target_type: 'company', + target_label: 'KORMAN SHIPPING CO LTD', + field: 'ships_to' + }, + { + source: 'jio9McDQStiGK81KjYgRLg', + source_type: 'company', + source_label: 'KORMAN INTERNATIONAL CO,LTD', + target: '6gYDDgHxQFvOuTnrAU0-fA', + target_type: 'company', + target_label: 'KORMAN SHIPPING CO LTD', + field: 'ships_to' + }, + { + source: '7bHHKb7AKo0_fnN5SEBZUA', + source_type: 'company', + source_label: 'DAMCO USA INC', + target: 'y1oenfwLluo8usXEn02pMg', + target_type: 'company', + target_label: 'MAERSK LOGISTICS & SERVICES', + field: 'ships_to' + }, + { + source: 'lzwK0JHTDWqHiY5UWKjeLA', + source_type: 'company', + source_label: 'KORMAN SHIPPING CO. LTD SHENZHEN', + target: '7bHHKb7AKo0_fnN5SEBZUA', + target_type: 'company', + target_label: 'DAMCO USA INC', + field: 'ships_to' + }, + { + source: '9ZnnVk4TqK5Hf-lYclVSsg', + source_type: 'company', + source_label: 'MAERSK LOGISTICS & SERVICES JAPAN K.K.', + target: '7bHHKb7AKo0_fnN5SEBZUA', + target_type: 'company', + target_label: 'DAMCO USA INC', + field: 'ships_to' + }, + { + source: 'j3gJpgUWAuPtbTFckbgdDQ', + source_type: 'company', + source_label: 'AMCO INDIA PVT LTD.', + target: '7bHHKb7AKo0_fnN5SEBZUA', + target_type: 'company', + target_label: 'DAMCO USA INC', + field: 'ships_to' + }, + { + source: 'yxMfCncq4TeTgPyZO2NB5Q', + source_type: 'company', + source_label: 'DAMCO CHILE S.A.', + target: '7bHHKb7AKo0_fnN5SEBZUA', + target_type: 'company', + target_label: 'DAMCO USA INC', + field: 'ships_to' + }, + { + source: 'modFk0vIz0mn61-pgr6Z6Q', + source_type: 'company', + source_label: 'DAMCO HONGKONG LTD', + target: '7bHHKb7AKo0_fnN5SEBZUA', + target_type: 'company', + target_label: 'DAMCO USA INC', + field: 'ships_to' + }, + { + source: 'CzlcJF-FpJNlTlvktgvA_Q', + source_type: 'company', + source_label: 'KORMAN SHIPPING COMPANY LIMITED', + target: '7bHHKb7AKo0_fnN5SEBZUA', + target_type: 'company', + target_label: 'DAMCO USA INC', + field: 'ships_to' + }, + { + source: 'HJi9AjE4xFjPrn-oH2E3ag', + source_type: 'company', + source_label: 'PLS USE CODE 42200017952', + target: '7bHHKb7AKo0_fnN5SEBZUA', + target_type: 'company', + target_label: 'DAMCO USA INC', + field: 'ships_to' + }, + { + source: 'etw-jLRUoWCh3WllV7YIig', + source_type: 'company', + source_label: 'DAMCO INDIA PRVIATE LIMITED', + target: '7bHHKb7AKo0_fnN5SEBZUA', + target_type: 'company', + target_label: 'DAMCO USA INC', + field: 'ships_to' + }, + { + source: 'J7HINB6gFsk8mdEXS4T3og', + source_type: 'company', + source_label: 'MAERSK LOGISTICS&SERVICES KOREA L', + target: '7bHHKb7AKo0_fnN5SEBZUA', + target_type: 'company', + target_label: 'DAMCO USA INC', + field: 'ships_to' + }, + { + source: 'JrllVAyPUX1OxrX5ZLmGBw', + source_type: 'company', + source_label: 'MAERSK LOGISTICS&SERVICES MALAYSI JL TANJUNG', + target: '7bHHKb7AKo0_fnN5SEBZUA', + target_type: 'company', + target_label: 'DAMCO USA INC', + field: 'ships_to' + }, + { + source: 'TjF3TvsAhqFe4rpuS-0DTQ', + source_type: 'company', + source_label: 'DAMCO JAPAN K.K.ON BEHALF OF DAMC INTERNATIONAL B.V.', + target: '7bHHKb7AKo0_fnN5SEBZUA', + target_type: 'company', + target_label: 'DAMCO USA INC', + field: 'ships_to' + }, + { + source: 'WHxCa4nldeGKc8y85xs37g', + source_type: 'company', + source_label: 'DAMCO CHINA LIMITED QINGDAO BRANC FLAG SHIP TOWER', + target: '7bHHKb7AKo0_fnN5SEBZUA', + target_type: 'company', + target_label: 'DAMCO USA INC', + field: 'ships_to' + }, + { + source: 'fwqbbCC1N7XZwnmCnCiDMQ', + source_type: 'company', + source_label: 'MAERSK DENMARK A/S', + target: '7bHHKb7AKo0_fnN5SEBZUA', + target_type: 'company', + target_label: 'DAMCO USA INC', + field: 'ships_to' + }, + { + source: 'pnlxkBnofo4peuT4iAcUbQ', + source_type: 'company', + source_label: 'DAMCO JAPAN K.K.ON BEHARLF OF DAM INTERNATIONAL B.V.', + target: '7bHHKb7AKo0_fnN5SEBZUA', + target_type: 'company', + target_label: 'DAMCO USA INC', + field: 'ships_to' + }, + { + source: 'h5XDqmqCRzFp6DvCHGNKlQ', + source_type: 'company', + source_label: 'MAERSK LOGISTICS&SERVICES MALAYSI JALAN TANJUNG A/', + target: '7bHHKb7AKo0_fnN5SEBZUA', + target_type: 'company', + target_label: 'DAMCO USA INC', + field: 'ships_to' + }, + { + source: 'OzUMOsvqzksKySFazxydbA', + source_type: 'company', + source_label: 'MAERSK LOGISTICS AND SERVICES FASCINATIO BOULEVARD', + target: '7bHHKb7AKo0_fnN5SEBZUA', + target_type: 'company', + target_label: 'DAMCO USA INC', + field: 'ships_to' + }, + { + source: 'djsQwFecu4f9jIZJvzq4SQ', + source_type: 'company', + source_label: 'DAMCO JAPAN K.K.', + target: '7bHHKb7AKo0_fnN5SEBZUA', + target_type: 'company', + target_label: 'DAMCO USA INC', + field: 'ships_to' + }, + { + source: 'Z5cZFF_q0M2AODi-JAhShQ', + source_type: 'company', + source_label: 'DAMCO NINGBO BRANCH', + target: '7bHHKb7AKo0_fnN5SEBZUA', + target_type: 'company', + target_label: 'DAMCO USA INC', + field: 'ships_to' + }, + { + source: 'WkwjJmvpNmsAyAnGepN13A', + source_type: 'company', + source_label: 'DAMCO LOGISTICS KOREA LIMITED CRE', + target: '7bHHKb7AKo0_fnN5SEBZUA', + target_type: 'company', + target_label: 'DAMCO USA INC', + field: 'ships_to' + }, + { + source: 'pZqstjq8FWFE5GpYEIUSSA', + source_type: 'company', + source_label: 'FOREWAY LOGISTICS (PVT) LIMITED', + target: '7bHHKb7AKo0_fnN5SEBZUA', + target_type: 'company', + target_label: 'DAMCO USA INC', + field: 'ships_to' + }, + { + source: 'JjVF4dpSylqcnFyCJr8eqA', + source_type: 'company', + source_label: 'DAMCO JAPAN K.K.ON BEHALF OF DAMCO INTERNATIONAL B.V.', + target: '7bHHKb7AKo0_fnN5SEBZUA', + target_type: 'company', + target_label: 'DAMCO USA INC', + field: 'ships_to' + }, + { + source: 'scm8id2LumSm3WJmI4PuOw', + source_type: 'company', + source_label: 'DAMCO LOGISTICS (THAILAND) CO., LTD', + target: '7bHHKb7AKo0_fnN5SEBZUA', + target_type: 'company', + target_label: 'DAMCO USA INC', + field: 'ships_to' + }, + { + source: 'ktipxeIEF55QCzVdbfP7iw', + source_type: 'company', + source_label: 'DAMCO JAPAN K.K.ON BEHALF OF DAMCO INTERNATIONAL B.V.V', + target: '7bHHKb7AKo0_fnN5SEBZUA', + target_type: 'company', + target_label: 'DAMCO USA INC', + field: 'ships_to' + }, + { + source: 'qhv5GINGrrBxMkkvFFNGKw', + source_type: 'company', + source_label: 'KORMAN SHIPPING CO., LTD O/B KORMAN SHIPPING CO., LTD', + target: '7bHHKb7AKo0_fnN5SEBZUA', + target_type: 'company', + target_label: 'DAMCO USA INC', + field: 'ships_to' + }, + { + source: 'NGYfJrPKZgrZxL3yoUciAA', + source_type: 'company', + source_label: 'DAMCO PAKISTAN PVT LIMITED', + target: '7bHHKb7AKo0_fnN5SEBZUA', + target_type: 'company', + target_label: 'DAMCO USA INC', + field: 'ships_to' + }, + { + source: 'i3lfIFMMirriZOMlqgCPcw', + source_type: 'company', + source_label: 'MAERS ITALIA SPA', + target: '7bHHKb7AKo0_fnN5SEBZUA', + target_type: 'company', + target_label: 'DAMCO USA INC', + field: 'ships_to' + }, + { + source: 'Z_R3Ol2j_-dsOM7UuH3PTw', + source_type: 'company', + source_label: 'PT. KANINDO MAKMUR JAYA', + target: '875yxpVvxV2RsweKMRiu7g', + target_type: 'company', + target_label: 'NIKE USA, INC.', + field: 'ships_to' + }, + { + source: 'gdAQnpO4Ur8gdyHPPic-3g', + source_type: 'company', + source_label: 'Gul Ahmed Textile Mills Ltd', + target: 'Z_R3Ol2j_-dsOM7UuH3PTw', + target_type: 'company', + target_label: 'PT. KANINDO MAKMUR JAYA', + field: 'ships_to' + }, + { + source: 'zZ7Ld4jfxffrjb-c-uMCLg', + source_type: 'company', + source_label: 'SLC AGRICOLA S.A. -', + target: 'gdAQnpO4Ur8gdyHPPic-3g', + target_type: 'company', + target_label: 'Gul Ahmed Textile Mills Ltd', + field: 'ships_to' + }, + { + source: 'EbYkwTlltxKm93aFmwnr6Q', + source_type: 'company', + source_label: 'SLC AGRICOLA S.A. FAZENDA PANTANAL II ROD GO', + target: 'zZ7Ld4jfxffrjb-c-uMCLg', + target_type: 'company', + target_label: 'SLC AGRICOLA S.A. -', + field: 'ships_to' + }, + { + source: '4O7oZmLCm_z8wPLBTuKi4Q', + source_type: 'company', + source_label: 'SCHRODER & VOGEL GMBH', + target: 'gdAQnpO4Ur8gdyHPPic-3g', + target_type: 'company', + target_label: 'Gul Ahmed Textile Mills Ltd', + field: 'ships_to' + }, + { + source: '8PupZUriUI4omSKa4ayzNg', + source_type: 'company', + source_label: 'AVANEETHA TEXTILES (P) LTD', + target: '4O7oZmLCm_z8wPLBTuKi4Q', + target_type: 'company', + target_label: 'SCHRODER & VOGEL GMBH', + field: 'ships_to' + }, + { + source: 'mmUw3_AOYrgtiPEBoOZsZw', + source_type: 'company', + source_label: 'ООО "KHUMOYUN IMPEX', + target: '4O7oZmLCm_z8wPLBTuKi4Q', + target_type: 'company', + target_label: 'SCHRODER & VOGEL GMBH', + field: 'ships_to' + }, + { + source: 'EvLGfej9wOebHSyBAAiL5g', + source_type: 'company', + source_label: 'LX PANTOS', + target: 'gdAQnpO4Ur8gdyHPPic-3g', + target_type: 'company', + target_label: 'Gul Ahmed Textile Mills Ltd', + field: 'ships_to' + }, + { + source: 'vlC_1_swUfhdF1O1If7TiA', + source_type: 'person', + source_label: 'HANKOOK', + target: 'EvLGfej9wOebHSyBAAiL5g', + target_type: 'company', + target_label: 'LX PANTOS', + field: 'ships_to' + }, + { + source: '099K6W_pvK-sIPVA19cszQ', + source_type: 'person', + source_label: 'HYOSUNG', + target: 'EvLGfej9wOebHSyBAAiL5g', + target_type: 'company', + target_label: 'LX PANTOS', + field: 'ships_to' + }, + { + source: 'QK8hpg_GKeDHhKekrLIMVQ', + source_type: 'company', + source_label: 'LACHESIS CO., LTD.', + target: 'EvLGfej9wOebHSyBAAiL5g', + target_type: 'company', + target_label: 'LX PANTOS', + field: 'ships_to' + }, + { + source: 'pTOw8gwcz3cJLiUdDfOmyQ', + source_type: 'company', + source_label: 'LX PANTOS VIETNAM CO., LTD', + target: 'EvLGfej9wOebHSyBAAiL5g', + target_type: 'company', + target_label: 'LX PANTOS', + field: 'ships_to' + }, + { + source: 'KD3kWoMGPiIvEIF6h1t_eA', + source_type: 'company', + source_label: 'SUL DE MINAS INGREDIENTES LTDA', + target: 'EvLGfej9wOebHSyBAAiL5g', + target_type: 'company', + target_label: 'LX PANTOS', + field: 'ships_to' + }, + { + source: 'Ltq9E3IL6c6UnVkm1rM1nQ', + source_type: 'company', + source_label: 'SOUTHCO INDIA PVT. LTD.', + target: 'EvLGfej9wOebHSyBAAiL5g', + target_type: 'company', + target_label: 'LX PANTOS', + field: 'ships_to' + }, + { + source: 'fBQL7wJqTbrgqP7gEEeDZA', + source_type: 'company', + source_label: 'DSV', + target: 'EvLGfej9wOebHSyBAAiL5g', + target_type: 'company', + target_label: 'LX PANTOS', + field: 'ships_to' + }, + { + source: 'dZqUiB2HNHWfA3H7N5c-8w', + source_type: 'company', + source_label: 'Pt Lx Pantos Indonesia Kawasan Industries', + target: 'EvLGfej9wOebHSyBAAiL5g', + target_type: 'company', + target_label: 'LX PANTOS', + field: 'ships_to' + }, + { + source: 'lfPRFv_D4br8MHICrmd2gw', + source_type: 'company', + source_label: 'LG MMA CORP.', + target: 'EvLGfej9wOebHSyBAAiL5g', + target_type: 'company', + target_label: 'LX PANTOS', + field: 'ships_to' + }, + { + source: '_ZzYVj4PdLNbJPzki4XezQ', + source_type: 'company', + source_label: 'HANAM TEXTILE COMPANY', + target: 'gdAQnpO4Ur8gdyHPPic-3g', + target_type: 'company', + target_label: 'Gul Ahmed Textile Mills Ltd', + field: 'ships_to' + }, + { + source: 'H1oGJI-KX28MqOtTHEI85g', + source_type: 'person', + source_label: 'KAIPAA BOBBINS', + target: '_ZzYVj4PdLNbJPzki4XezQ', + target_type: 'company', + target_label: 'HANAM TEXTILE COMPANY', + field: 'ships_to' + }, + { + source: '1q-qiAkgeyZO0ssY4DpjhQ', + source_type: 'company', + source_label: 'SOJITZ MACHINERY CORPORATION', + target: 'gdAQnpO4Ur8gdyHPPic-3g', + target_type: 'company', + target_label: 'Gul Ahmed Textile Mills Ltd', + field: 'ships_to' + }, + { + source: 'jLfkcSklnWQtzH-yaXc8uA', + source_type: 'company', + source_label: 'RABA AXLE LTD.', + target: '1q-qiAkgeyZO0ssY4DpjhQ', + target_type: 'company', + target_label: 'SOJITZ MACHINERY CORPORATION', + field: 'ships_to' + }, + { + source: 'LPZs073A_H5EulXLDd_1Kw', + source_type: 'company', + source_label: 'SOJITZ MACHINERY CORPORATION TOKYO JAPAN', + target: '1q-qiAkgeyZO0ssY4DpjhQ', + target_type: 'company', + target_label: 'SOJITZ MACHINERY CORPORATION', + field: 'ships_to' + }, + { + source: 'OpEGnhUpyCVn-yMSePlE7A', + source_type: 'company', + source_label: 'Công Ty TNHH Dệt Hà Nam', + target: 'gdAQnpO4Ur8gdyHPPic-3g', + target_type: 'company', + target_label: 'Gul Ahmed Textile Mills Ltd', + field: 'ships_to' + }, + { + source: 'H5XitINIykLkxgs7FMD1AA', + source_type: 'company', + source_label: 'GOETZ AND SONS INCORPORATED', + target: 'OpEGnhUpyCVn-yMSePlE7A', + target_type: 'company', + target_label: 'Công Ty TNHH Dệt Hà Nam', + field: 'ships_to' + }, + { + source: 'lgARqBIT3_GcZHCfPnMiKQ', + source_type: 'company', + source_label: 'OLAM AGRI AMERICAS, INC', + target: 'gdAQnpO4Ur8gdyHPPic-3g', + target_type: 'company', + target_label: 'Gul Ahmed Textile Mills Ltd', + field: 'ships_to' + }, + { + source: 'TRIkUPL6azccXaXVccbGSw', + source_type: 'person', + source_label: 'OLAM COTTON', + target: 'lgARqBIT3_GcZHCfPnMiKQ', + target_type: 'company', + target_label: 'OLAM AGRI AMERICAS, INC', + field: 'ships_to' + }, + { + source: 'sW89C-PdVENsoNtUluXeaw', + source_type: 'company', + source_label: 'OLAM GLOBAL AGRI PERU SAC', + target: 'lgARqBIT3_GcZHCfPnMiKQ', + target_type: 'company', + target_label: 'OLAM AGRI AMERICAS, INC', + field: 'ships_to' + }, + { + source: 'arSWN-foFbT4_jtNYGC2Lw', + source_type: 'company', + source_label: 'LEXZAU, SCHARBAU GMBH & CO KG', + target: 'gdAQnpO4Ur8gdyHPPic-3g', + target_type: 'company', + target_label: 'Gul Ahmed Textile Mills Ltd', + field: 'ships_to' + }, + { + source: 'P1OojSELZIuszlGgNwwDsg', + source_type: 'company', + source_label: 'LESCHACO KOREA O/B OF', + target: 'arSWN-foFbT4_jtNYGC2Lw', + target_type: 'company', + target_label: 'LEXZAU, SCHARBAU GMBH & CO KG', + field: 'ships_to' + }, + { + source: 'I5BydauAUgAkNqkQ_T0ztQ', + source_type: 'company', + source_label: 'LESCHACO (CHINA) LIMITED NINGBO', + target: 'arSWN-foFbT4_jtNYGC2Lw', + target_type: 'company', + target_label: 'LEXZAU, SCHARBAU GMBH & CO KG', + field: 'ships_to' + }, + { + source: '_GePUmQxC3NJjmHpKJXyPQ', + source_type: 'company', + source_label: 'MOL CONSOLIDATION SERVICE LTD', + target: '23vQxJdeBrvwq5UgIHOnPw', + target_type: 'company', + target_label: 'ARCTERYX EQUIPMENT', + field: 'ships_to' + }, + { + source: 'hzIaFKpm5qTSQ4OcY_bceg', + source_type: 'company', + source_label: 'MOL CONSOLIDATION SERVICE LIMITED', + target: '_GePUmQxC3NJjmHpKJXyPQ', + target_type: 'company', + target_label: 'MOL CONSOLIDATION SERVICE LTD', + field: 'ships_to' + }, + { + source: 'aT8JFtKy9tIEADYpCJbbAw', + source_type: 'company', + source_label: 'MOL CONSOLIDATION SERVICE LIMITED SHENZHEN BRANCH', + target: 'hzIaFKpm5qTSQ4OcY_bceg', + target_type: 'company', + target_label: 'MOL CONSOLIDATION SERVICE LIMITED', + field: 'ships_to' + }, + { + source: 'uabqIP8ejN2B3fhAHuJwTA', + source_type: 'company', + source_label: 'BRANCH OF MOL CONSOLIDATION SERVICE LIMITED', + target: 'hzIaFKpm5qTSQ4OcY_bceg', + target_type: 'company', + target_label: 'MOL CONSOLIDATION SERVICE LIMITED', + field: 'ships_to' + }, + { + source: 'w5jyY5NtgVKAF8iBo7zjiQ', + source_type: 'company', + source_label: 'MOL CONSOLIDATION SERVICE (VIETNAM) CO.,LTD', + target: 'hzIaFKpm5qTSQ4OcY_bceg', + target_type: 'company', + target_label: 'MOL CONSOLIDATION SERVICE LIMITED', + field: 'ships_to' + }, + { + source: '_Kvu9lxrQOFVFBWWX2nJDw', + source_type: 'company', + source_label: 'YOUNGONE (CEPZ) LTD', + target: '23vQxJdeBrvwq5UgIHOnPw', + target_type: 'company', + target_label: 'ARCTERYX EQUIPMENT', + field: 'ships_to' + }, + { + source: '6VExO6TrtSDHnGcoGTEcMQ', + source_type: 'company', + source_label: 'KRISHNA LAMICOAT PRIVATE LIMITED', + target: '_Kvu9lxrQOFVFBWWX2nJDw', + target_type: 'company', + target_label: 'YOUNGONE (CEPZ) LTD', + field: 'ships_to' + }, + { + source: 'tIv1JANDINjyzYpogb4h_A', + source_type: 'company', + source_label: 'DNZ RESOURCES FZC', + target: '6VExO6TrtSDHnGcoGTEcMQ', + target_type: 'company', + target_label: 'KRISHNA LAMICOAT PRIVATE LIMITED', + field: 'ships_to' + }, + { + source: 'M3l5NgAY8qkoaVrul793hQ', + source_type: 'company', + source_label: 'QADRI GLOBAL INC', + target: '6VExO6TrtSDHnGcoGTEcMQ', + target_type: 'company', + target_label: 'KRISHNA LAMICOAT PRIVATE LIMITED', + field: 'ships_to' + }, + { + source: 'QzlmPuewCXCPeVWjckn56g', + source_type: 'company', + source_label: 'CHAMPION MACHINERY MANUFACTURING COMPANY', + target: '6VExO6TrtSDHnGcoGTEcMQ', + target_type: 'company', + target_label: 'KRISHNA LAMICOAT PRIVATE LIMITED', + field: 'ships_to' + }, + { + source: 'IOXeV8184hZua3rWOC48Iw', + source_type: 'company', + source_label: 'UMLENSKI EOOD VAT BG', + target: '6VExO6TrtSDHnGcoGTEcMQ', + target_type: 'company', + target_label: 'KRISHNA LAMICOAT PRIVATE LIMITED', + field: 'ships_to' + }, + { + source: 'JDn867-zbtF-5jmGhCZYWA', + source_type: 'company', + source_label: 'Công Ty TNHH Sơn Hà', + target: 'Be1vdQekKL83u9Aq_rEWFw', + target_type: 'company', + target_label: 'ECLAT TEXTILE CO., LTD', + field: 'ships_to' + }, + { + source: 'xxfi95LpHIhVJnfKaudYBQ', + source_type: 'company', + source_label: 'RUSHAN LONGMA GARMENT CO.,LTD', + target: 'JDn867-zbtF-5jmGhCZYWA', + target_type: 'company', + target_label: 'Công Ty TNHH Sơn Hà', + field: 'ships_to' + }, + { + source: '4Jkdon6XCOev7AUsJ1HOmw', + source_type: 'company', + source_label: 'CôNG TY TNHH ĐầU Tư Và PHáT TRIểN MINH QUANG VINA', + target: 'xxfi95LpHIhVJnfKaudYBQ', + target_type: 'company', + target_label: 'RUSHAN LONGMA GARMENT CO.,LTD', + field: 'ships_to' + }, + { + source: 'e8ES2_QBlXRGTdJQIbnFgQ', + source_type: 'company', + source_label: 'VINEX, SPOL. S.R.O.', + target: 'JDn867-zbtF-5jmGhCZYWA', + target_type: 'company', + target_label: 'Công Ty TNHH Sơn Hà', + field: 'ships_to' + }, + { + source: 'DM194iFyiENALb5Cs8U8-w', + source_type: 'company', + source_label: 'CôNG TY TNHH MAY MặC XUấT NHậP KHẩU GALAXY VINA', + target: 'e8ES2_QBlXRGTdJQIbnFgQ', + target_type: 'company', + target_label: 'VINEX, SPOL. S.R.O.', + field: 'ships_to' + }, + { + source: 'FIdog3J2WSI6M9hRhKVF9A', + source_type: 'company', + source_label: 'CONG TY TNHH GUNZE VIET NAM', + target: 'JDn867-zbtF-5jmGhCZYWA', + target_type: 'company', + target_label: 'Công Ty TNHH Sơn Hà', + field: 'ships_to' + }, + { + source: 'UmRoeP24T-CTActOKg8BRg', + source_type: 'person', + source_label: 'Cty TNHH Phước Lộc Thành', + target: 'FIdog3J2WSI6M9hRhKVF9A', + target_type: 'company', + target_label: 'CONG TY TNHH GUNZE VIET NAM', + field: 'ships_to' + }, + { + source: 'lB6DP6_wC1yypC1zjq9gBg', + source_type: 'company', + source_label: 'CONG TY TNHH SAN XUAT - THUONG MAI - DICH VU PHUOC TAM HANG', + target: 'FIdog3J2WSI6M9hRhKVF9A', + target_type: 'company', + target_label: 'CONG TY TNHH GUNZE VIET NAM', + field: 'ships_to' + }, + { + source: 'WrbZrvUVD8JLAv5s-CaGBw', + source_type: 'company', + source_label: 'CÔNG TY TNHH MỘT THÀNH VIÊN MAY MẶC VĨNH MAI', + target: 'FIdog3J2WSI6M9hRhKVF9A', + target_type: 'company', + target_label: 'CONG TY TNHH GUNZE VIET NAM', + field: 'ships_to' + }, + { + source: 'WinIZgxQHnKrznqrw8ON8Q', + source_type: 'company', + source_label: 'Công Ty TNHH DV TM SX Hưng Thịnh Lợi', + target: 'FIdog3J2WSI6M9hRhKVF9A', + target_type: 'company', + target_label: 'CONG TY TNHH GUNZE VIET NAM', + field: 'ships_to' + }, + { + source: 'wyFBznHrsnRV5s3FvlZI6g', + source_type: 'company', + source_label: 'CONG TY TNHH SAN XUAT THUONG MAI KY THUAT BAO CHAU', + target: 'FIdog3J2WSI6M9hRhKVF9A', + target_type: 'company', + target_label: 'CONG TY TNHH GUNZE VIET NAM', + field: 'ships_to' + }, + { + source: 'tih_qbrqJ6bPL2D2P1rc_A', + source_type: 'company', + source_label: 'Công Ty TNHH May Nhật Tân', + target: 'FIdog3J2WSI6M9hRhKVF9A', + target_type: 'company', + target_label: 'CONG TY TNHH GUNZE VIET NAM', + field: 'ships_to' + }, + { + source: '7cb3OqbKZ4PSKp1d67nX6A', + source_type: 'company', + source_label: 'Công Ty TNHH Sản Xuất Xuất Nhập Khẩu Tường Đức Phú', + target: 'FIdog3J2WSI6M9hRhKVF9A', + target_type: 'company', + target_label: 'CONG TY TNHH GUNZE VIET NAM', + field: 'ships_to' + }, + { + source: 'MAS-5HBaH8KxjI3zMsborA', + source_type: 'company', + source_label: 'CONG TY TNHH KY THUAT HM TECH', + target: 'FIdog3J2WSI6M9hRhKVF9A', + target_type: 'company', + target_label: 'CONG TY TNHH GUNZE VIET NAM', + field: 'ships_to' + }, + { + source: 'L8RQOFDgCLWQVub-xS5xIQ', + source_type: 'company', + source_label: 'IFG CORPORATION', + target: 'JDn867-zbtF-5jmGhCZYWA', + target_type: 'company', + target_label: 'Công Ty TNHH Sơn Hà', + field: 'ships_to' + }, + { + source: 'ogw_dCjnIUUydVhDXVlI2g', + source_type: 'company', + source_label: 'MINH ANH KIM LIEN GARMENT JSC', + target: 'L8RQOFDgCLWQVub-xS5xIQ', + target_type: 'company', + target_label: 'IFG CORPORATION', + field: 'ships_to' + }, + { + source: 'SNm-deybr6-NcCWokeFMtQ', + source_type: 'company', + source_label: 'M U FASHION LTD', + target: 'L8RQOFDgCLWQVub-xS5xIQ', + target_type: 'company', + target_label: 'IFG CORPORATION', + field: 'ships_to' + }, + { + source: '8IHwQjOzOSrQTeoZIhXCrw', + source_type: 'company', + source_label: 'NLZ FASHION LTD', + target: 'L8RQOFDgCLWQVub-xS5xIQ', + target_type: 'company', + target_label: 'IFG CORPORATION', + field: 'ships_to' + }, + { + source: '-A29KkCVo7oQpgDtvJQ4DA', + source_type: 'company', + source_label: 'AMIR SHIRTS LTD', + target: 'L8RQOFDgCLWQVub-xS5xIQ', + target_type: 'company', + target_label: 'IFG CORPORATION', + field: 'ships_to' + }, + { + source: 'Kh6seN1Xl9gqB3_S9aD-7w', + source_type: 'company', + source_label: 'RDM APPARELS LIMITED', + target: 'L8RQOFDgCLWQVub-xS5xIQ', + target_type: 'company', + target_label: 'IFG CORPORATION', + field: 'ships_to' + }, + { + source: 'cjEvV-YXZMO3sbSLLJA3zA', + source_type: 'company', + source_label: 'TOP ROYAL FLASH VIETNAM CO., LTD', + target: 'L8RQOFDgCLWQVub-xS5xIQ', + target_type: 'company', + target_label: 'IFG CORPORATION', + field: 'ships_to' + }, + { + source: 'MuzgULAMahYnpyFRrGCXcw', + source_type: 'company', + source_label: 'SIRINA GARMENTS AND TEXTILE LTD', + target: 'L8RQOFDgCLWQVub-xS5xIQ', + target_type: 'company', + target_label: 'IFG CORPORATION', + field: 'ships_to' + }, + { + source: 'AHxUxxuosfh9J_UO2zTCyw', + source_type: 'company', + source_label: 'KATTALI TEXTILE LIMITED', + target: 'L8RQOFDgCLWQVub-xS5xIQ', + target_type: 'company', + target_label: 'IFG CORPORATION', + field: 'ships_to' + }, + { + source: '88KZYTmhJ-AqaXUhIYsY2w', + source_type: 'company', + source_label: 'BYZID APPARELS (PVT) LTD', + target: 'L8RQOFDgCLWQVub-xS5xIQ', + target_type: 'company', + target_label: 'IFG CORPORATION', + field: 'ships_to' + }, + { + source: 'LUgBwgjbrtp-ETTEMwzaIQ', + source_type: 'company', + source_label: 'NEW ASIA FASHIONS LIMITED', + target: 'L8RQOFDgCLWQVub-xS5xIQ', + target_type: 'company', + target_label: 'IFG CORPORATION', + field: 'ships_to' + }, + { + source: 'Bu_3SPz-vgiOZtnrtv5n3g', + source_type: 'company', + source_label: 'FARMIN FASHION DESIGN LTD', + target: 'L8RQOFDgCLWQVub-xS5xIQ', + target_type: 'company', + target_label: 'IFG CORPORATION', + field: 'ships_to' + }, + { + source: 'YQbR1WKYZKJeFXUf6uv5oQ', + source_type: 'company', + source_label: 'HOA DO 3 CO., LTD.', + target: 'L8RQOFDgCLWQVub-xS5xIQ', + target_type: 'company', + target_label: 'IFG CORPORATION', + field: 'ships_to' + }, + { + source: 'Qesp_rhWD1IANk6UWTRlfQ', + source_type: 'company', + source_label: 'FARMIN APPARELS LIMITED', + target: 'L8RQOFDgCLWQVub-xS5xIQ', + target_type: 'company', + target_label: 'IFG CORPORATION', + field: 'ships_to' + }, + { + source: 'lpgy8uwv8eG_Dl4qspRYDw', + source_type: 'company', + source_label: 'INDEPENDENT APPARELS LIMITED', + target: 'L8RQOFDgCLWQVub-xS5xIQ', + target_type: 'company', + target_label: 'IFG CORPORATION', + field: 'ships_to' + }, + { + source: 'zW_nydyIm8O3VD33pe0o0Q', + source_type: 'company', + source_label: 'CôNG TY TNHH NGUồN á CHâU', + target: 'Be1vdQekKL83u9Aq_rEWFw', + target_type: 'company', + target_label: 'ECLAT TEXTILE CO., LTD', + field: 'ships_to' + }, + { + source: 'h1c1zINOWdVkED8hp9ispA', + source_type: 'company', + source_label: 'MADEIRA GARNFABRIK RUDOLF SCHMIDT KG', + target: 'zW_nydyIm8O3VD33pe0o0Q', + target_type: 'company', + target_label: 'CôNG TY TNHH NGUồN á CHâU', + field: 'ships_to' + }, + { + source: '_pPxcNFwuMu_5FSWOv4w6g', + source_type: 'company', + source_label: 'KINGFLOWER THREAD(HK)CO.,LIMITED', + target: 'h1c1zINOWdVkED8hp9ispA', + target_type: 'company', + target_label: 'MADEIRA GARNFABRIK RUDOLF SCHMIDT KG', + field: 'ships_to' + }, + { + source: 'T4MPSlvIEaYFldsX2xb7fA', + source_type: 'person', + source_label: 'Cty TNHH Dây Khóa Kéo KEEN CHING', + target: 'Be1vdQekKL83u9Aq_rEWFw', + target_type: 'company', + target_label: 'ECLAT TEXTILE CO., LTD', + field: 'ships_to' + }, + { + source: 'hiGgxEXPgFXhqHk6i1G6zg', + source_type: 'company', + source_label: 'CÔNG TY TNHH CỮU PHÚ', + target: 'T4MPSlvIEaYFldsX2xb7fA', + target_type: 'person', + target_label: 'Cty TNHH Dây Khóa Kéo KEEN CHING', + field: 'ships_to' + }, + { + source: 'DKIXZUwkld43RoWu3KTWpA', + source_type: 'company', + source_label: 'JOFULL ENTERPRISE CO.,LTD', + target: 'hiGgxEXPgFXhqHk6i1G6zg', + target_type: 'company', + target_label: 'CÔNG TY TNHH CỮU PHÚ', + field: 'ships_to' + }, + { + source: 'ByaP64YCoZNVRIpXaUUKMQ', + source_type: 'company', + source_label: 'GUANGDONG BORUNTE TECHNOLOGY CO.,LTD', + target: 'hiGgxEXPgFXhqHk6i1G6zg', + target_type: 'company', + target_label: 'CÔNG TY TNHH CỮU PHÚ', + field: 'ships_to' + }, + { + source: 'DF4w9KjlJ-A__x_6iWz60Q', + source_type: 'company', + source_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', + target: 'T4MPSlvIEaYFldsX2xb7fA', + target_type: 'person', + target_label: 'Cty TNHH Dây Khóa Kéo KEEN CHING', + field: 'ships_to' + }, + { + source: 'VKupH0pj4YhUwC6WD8TxGA', + source_type: 'company', + source_label: 'WUXI YIH SHING CHEUN MACHINE CO., LTD', + target: 'DF4w9KjlJ-A__x_6iWz60Q', + target_type: 'company', + target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', + field: 'ships_to' + }, + { + source: 'fKTs7nnpxdQxahXh3Nq9JA', + source_type: 'company', + source_label: 'WEI TAI CORPORATION', + target: 'DF4w9KjlJ-A__x_6iWz60Q', + target_type: 'company', + target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', + field: 'ships_to' + }, + { + source: '9C5_d83OpEwNewVVOjHNrw', + source_type: 'company', + source_label: 'CELLULE CO., LTD', + target: 'DF4w9KjlJ-A__x_6iWz60Q', + target_type: 'company', + target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', + field: 'ships_to' + }, + { + source: 'x65TbmYhGSttNMadWTe3pw', + source_type: 'company', + source_label: 'KAI CHU INTERNATIONAL CO., LTD', + target: 'DF4w9KjlJ-A__x_6iWz60Q', + target_type: 'company', + target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', + field: 'ships_to' + }, + { + source: 'HRhx5phSt7svZRLQg6dkmQ', + source_type: 'company', + source_label: 'CHANGZHOU ZHANYE CONSTRUCTION MACHINERY CO., LTD', + target: 'DF4w9KjlJ-A__x_6iWz60Q', + target_type: 'company', + target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', + field: 'ships_to' + }, + { + source: 'tWKCgz02--b74qoWA95xqQ', + source_type: 'company', + source_label: 'PEIR JIUH ENTERPRISE CO., LTD', + target: 'DF4w9KjlJ-A__x_6iWz60Q', + target_type: 'company', + target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', + field: 'ships_to' + }, + { + source: 'ryzCj9dCSzbaCDsz0h-Jlg', + source_type: 'company', + source_label: 'QUINN LIN CO., LTD', + target: 'DF4w9KjlJ-A__x_6iWz60Q', + target_type: 'company', + target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', + field: 'ships_to' + }, + { + source: 'cNG08yZf9q6ZMY7nVYA2ew', + source_type: 'company', + source_label: "XI'AN ARESWIN PRECISION MACHINERY CO.,LTD", + target: 'DF4w9KjlJ-A__x_6iWz60Q', + target_type: 'company', + target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', + field: 'ships_to' + }, + { + source: 'qxihlhEk7ukFF-QQQZLOxQ', + source_type: 'company', + source_label: 'NEWNOL BIOTECH CO., LTD.', + target: 'DF4w9KjlJ-A__x_6iWz60Q', + target_type: 'company', + target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', + field: 'ships_to' + }, + { + source: '5pMw3lvZF6qJtPvdxK_ZQA', + source_type: 'company', + source_label: 'WUXI HONGYUAN ELECTROMECHANICAL TECHNOLOGY CO., LTD', + target: 'DF4w9KjlJ-A__x_6iWz60Q', + target_type: 'company', + target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', + field: 'ships_to' + }, + { + source: 'GJyRWZ96de2RRiTcMS_Uaw', + source_type: 'company', + source_label: 'YSR REED CO., LTD', + target: 'DF4w9KjlJ-A__x_6iWz60Q', + target_type: 'company', + target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', + field: 'ships_to' + }, + { + source: 'y5H2UrmEBdNi2N-sXJWIng', + source_type: 'company', + source_label: 'SHANGHAI MITSUBOSHI TRADING CO.,LTD', + target: 'DF4w9KjlJ-A__x_6iWz60Q', + target_type: 'company', + target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', + field: 'ships_to' + }, + { + source: 'VyOd8MTrV5--TnMsNqgrkg', + source_type: 'company', + source_label: 'YOUNARUI INTERNATIONAL TRADING CO., LTD', + target: 'DF4w9KjlJ-A__x_6iWz60Q', + target_type: 'company', + target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', + field: 'ships_to' + }, + { + source: 'TvLMDrbn5BHeFkf6uZASDA', + source_type: 'company', + source_label: 'YANG JIN DA CO., LTD', + target: 'DF4w9KjlJ-A__x_6iWz60Q', + target_type: 'company', + target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', + field: 'ships_to' + }, + { + source: 'ncHocsMhR3-RS3U7yuaNwQ', + source_type: 'company', + source_label: 'MURATA MACHINERY TAIWAN , LTD.', + target: 'DF4w9KjlJ-A__x_6iWz60Q', + target_type: 'company', + target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', + field: 'ships_to' + }, + { + source: 'a1gh_ttb6-W8ut9HgaVYQA', + source_type: 'company', + source_label: 'SHAOXING SKYLAR TRADING CO., LTD', + target: 'DF4w9KjlJ-A__x_6iWz60Q', + target_type: 'company', + target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', + field: 'ships_to' + }, + { + source: 'wbL8s9SNdI94NvqCEqeG7g', + source_type: 'company', + source_label: 'CHANGZHOU ZHANYE CONSTRUCTION', + target: 'DF4w9KjlJ-A__x_6iWz60Q', + target_type: 'company', + target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', + field: 'ships_to' + }, + { + source: '7nI7ZPnQUEQBC1p_j1eWkw', + source_type: 'company', + source_label: 'OPTIMA VENTURES GROUP LIMITED', + target: 'DF4w9KjlJ-A__x_6iWz60Q', + target_type: 'company', + target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', + field: 'ships_to' + }, + { + source: '80PfVG_vuz0JkAjJIhvcLQ', + source_type: 'company', + source_label: 'AIR RICH TRADING DEVELOPMENT LTD', + target: 'DF4w9KjlJ-A__x_6iWz60Q', + target_type: 'company', + target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', + field: 'ships_to' + }, + { + source: 'nzHjdNwA8FjlDhrerUKTQA', + source_type: 'company', + source_label: 'GEENG TYAN ENTERPRISE CO., LTD.', + target: 'DF4w9KjlJ-A__x_6iWz60Q', + target_type: 'company', + target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', + field: 'ships_to' + }, + { + source: 'p2nNlo2SmAdn65QdX8weSA', + source_type: 'company', + source_label: 'TOYO TEXTILE CO LTD', + target: 'DF4w9KjlJ-A__x_6iWz60Q', + target_type: 'company', + target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', + field: 'ships_to' + }, + { + source: 'w790ve0Opp_Oc71h-Ma1SQ', + source_type: 'company', + source_label: 'HONG TAI HIGH NUMERATOR CO., LTD', + target: 'DF4w9KjlJ-A__x_6iWz60Q', + target_type: 'company', + target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', + field: 'ships_to' + }, + { + source: 's3EMkHt64foNbMFhZKsoNA', + source_type: 'company', + source_label: 'CôNG TY TNHH RTI ( VIệT NAM )', + target: 'T4MPSlvIEaYFldsX2xb7fA', + target_type: 'person', + target_label: 'Cty TNHH Dây Khóa Kéo KEEN CHING', + field: 'ships_to' + }, + { + source: 's5WBLgzMhI3KGpCZMchVoQ', + source_type: 'company', + source_label: 'KUNSHAN LITAI FIBER CO., LTD', + target: 's3EMkHt64foNbMFhZKsoNA', + target_type: 'company', + target_label: 'CôNG TY TNHH RTI ( VIệT NAM )', + field: 'ships_to' + }, + { + source: 'rcQyjwf5hkBF9snBWMY8ug', + source_type: 'company', + source_label: 'ARISTO GLOBAL INC.', + target: 's3EMkHt64foNbMFhZKsoNA', + target_type: 'company', + target_label: 'CôNG TY TNHH RTI ( VIệT NAM )', + field: 'ships_to' + }, + { + source: 'KE2fNwJSWT-cmbFI9i76Mg', + source_type: 'company', + source_label: 'OMNITEX INTERNATIONAL CORP.', + target: 's3EMkHt64foNbMFhZKsoNA', + target_type: 'company', + target_label: 'CôNG TY TNHH RTI ( VIệT NAM )', + field: 'ships_to' + }, + { + source: 'BQNENRwoOp6qRYIGgz7HMw', + source_type: 'company', + source_label: 'Công Ty TNHH Một Thành Viên Sơn Hà Duy Xuyên', + target: 'Be1vdQekKL83u9Aq_rEWFw', + target_type: 'company', + target_label: 'ECLAT TEXTILE CO., LTD', + field: 'ships_to' + }, + { + source: 'BY3TWAkWypPYP3p0jhO7kw', + source_type: 'company', + source_label: 'MIEN LI CORP (TAIWAN)', + target: 'BQNENRwoOp6qRYIGgz7HMw', + target_type: 'company', + target_label: 'Công Ty TNHH Một Thành Viên Sơn Hà Duy Xuyên', + field: 'ships_to' + }, + { + source: 'IzrHZn6NKvs0aXGRuoZ36A', + source_type: 'company', + source_label: 'CôNG TY TNHH MộT THàNH VIêN SơN Hà THăNG BìNH', + target: 'BY3TWAkWypPYP3p0jhO7kw', + target_type: 'company', + target_label: 'MIEN LI CORP (TAIWAN)', + field: 'ships_to' + }, + { + source: 'cDn2I1Dhnqj5Nos6xLMQxQ', + source_type: 'company', + source_label: 'DIBELLA B.V.', + target: 'gdAQnpO4Ur8gdyHPPic-3g', + target_type: 'company', + target_label: 'Gul Ahmed Textile Mills Ltd', + field: 'ships_to' + }, + { + source: 'HUjVKQ-aHwTvJ2tlJBY8Og', + source_type: 'company', + source_label: 'M/S A.B. EXPORTS (PVT) LTD,', + target: 'cDn2I1Dhnqj5Nos6xLMQxQ', + target_type: 'company', + target_label: 'DIBELLA B.V.', + field: 'ships_to' + }, + { + source: 'eRnhmbO5WYtDk_LDtJLPgg', + source_type: 'company', + source_label: 'WEISSENGRUBER TEXTIL GMBH,', + target: 'HUjVKQ-aHwTvJ2tlJBY8Og', + target_type: 'company', + target_label: 'M/S A.B. EXPORTS (PVT) LTD,', + field: 'ships_to' + }, + { + source: '2BtDFJ8skgyOhLjtfTud6Q', + source_type: 'company', + source_label: 'ALBASIT EXPORTS', + target: 'eRnhmbO5WYtDk_LDtJLPgg', + target_type: 'company', + target_label: 'WEISSENGRUBER TEXTIL GMBH,', + field: 'ships_to' + }, + { + source: '_UOiaWygi0JqPhJRjbPVTw', + source_type: 'company', + source_label: 'SAPPHIRE TEXTILE SDN BHD', + target: 'HUjVKQ-aHwTvJ2tlJBY8Og', + target_type: 'company', + target_label: 'M/S A.B. EXPORTS (PVT) LTD,', + field: 'ships_to' + }, + { + source: '7xllpuNJ6GomsHewwY44-Q', + source_type: 'company', + source_label: 'M/S SHAMSI INTERNATIONAL (PVT) LTD', + target: '_UOiaWygi0JqPhJRjbPVTw', + target_type: 'company', + target_label: 'SAPPHIRE TEXTILE SDN BHD', + field: 'ships_to' + }, + { + source: '10U5Etnn_K53zndMOlOQcg', + source_type: 'company', + source_label: 'B & D TEXTILES GMBH', + target: 'HUjVKQ-aHwTvJ2tlJBY8Og', + target_type: 'company', + target_label: 'M/S A.B. EXPORTS (PVT) LTD,', + field: 'ships_to' + }, + { + source: 'N1ncemi-0Rp3SIO_XM1KFg', + source_type: 'company', + source_label: 'ARSHAD CORPORATION (PVT) LIMTIED', + target: '10U5Etnn_K53zndMOlOQcg', + target_type: 'company', + target_label: 'B & D TEXTILES GMBH', + field: 'ships_to' + }, + { + source: 'lc7DqhHEOrqnrEPCW5V-lA', + source_type: 'company', + source_label: 'DAGHA TEXTILES (PVT.) LTD.', + target: '10U5Etnn_K53zndMOlOQcg', + target_type: 'company', + target_label: 'B & D TEXTILES GMBH', + field: 'ships_to' + }, + { + source: '1Bo9yl5iFwLyikvHWHyQpQ', + source_type: 'company', + source_label: 'M/S SHAKEEL TEXTILE INDUSTRIES', + target: '10U5Etnn_K53zndMOlOQcg', + target_type: 'company', + target_label: 'B & D TEXTILES GMBH', + field: 'ships_to' + }, + { + source: '7p41-7EcCoOy0b0lI1Io4w', + source_type: 'company', + source_label: 'M/S HASSAN TEXTILES', + target: '10U5Etnn_K53zndMOlOQcg', + target_type: 'company', + target_label: 'B & D TEXTILES GMBH', + field: 'ships_to' + }, + { + source: 'N6gcA1OtXfdql_Hu8DS_Hg', + source_type: 'company', + source_label: 'DAGHA TEXTILES (PVT.) LIMITED', + target: '10U5Etnn_K53zndMOlOQcg', + target_type: 'company', + target_label: 'B & D TEXTILES GMBH', + field: 'ships_to' + }, + { + source: 'CrmtuW83f95ryXiUnmJAhQ', + source_type: 'company', + source_label: 'AL RAHIM TEXTILE INDUSTRIES LIMITED', + target: 'cDn2I1Dhnqj5Nos6xLMQxQ', + target_type: 'company', + target_label: 'DIBELLA B.V.', + field: 'ships_to' + }, + { + source: 'VXhxnqwEsjW59EWgCVbcUw', + source_type: 'company', + source_label: 'MAUI AND SONS', + target: 'CrmtuW83f95ryXiUnmJAhQ', + target_type: 'company', + target_label: 'AL RAHIM TEXTILE INDUSTRIES LIMITED', + field: 'ships_to' + }, + { + source: 'fwYyNPTFUMniLVltbqBSMA', + source_type: 'person', + source_label: 'SAYAM KNIT FAB', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: 'DtTaH8Cg7EVXsuAU8RlbmQ', + source_type: 'company', + source_label: 'MARIS (H.K.) SPORTS GOODS CO.,', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: 'x7MWosNsmNXVl3tZGwT5bg', + source_type: 'company', + source_label: 'J&F HEAD WEAR (SIYANG) CO., LTD', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: 'EKfqm3qSvyXP3uMWNISJtQ', + source_type: 'company', + source_label: 'JINJIANG HONGXING FASHION WEAVING CO., LTD. NO', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: 'f-zE4s0FHt0LPfPCx3lFyw', + source_type: 'company', + source_label: 'NINGBO ZHENGTENG STATIONERY AND CHUN XIAO INDUSTRY ZONE BEILUN', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: 'Jo-LTRhq2cG7pNGvn-EsVA', + source_type: 'company', + source_label: 'NINGBO WAVEDREAM OSIA STATIONERY', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: 'OzA7Nmj7BXyAktspjqJGfg', + source_type: 'company', + source_label: 'NINGBO WAVEDREAM OUTDOOR PRODUCTS CO.,LTD.', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: 'suu3I6k-YKM38bYr99fECg', + source_type: 'company', + source_label: 'BAITAI GROUP LIMITED.', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: 't-zAQNFfSFHGj70zoQ4rbQ', + source_type: 'company', + source_label: 'WUXI LIJING APPAREL CO LTD', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: 'J7zmMyFFV1tW-lJIKiOKhg', + source_type: 'company', + source_label: 'MARIS(H.K)SPORTS GOODS CO.,LIMITED', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: 'gS4dOrYBUxcHtD1JfF48AQ', + source_type: 'company', + source_label: 'SHAOXING VISA-SX IMPORT AND EXPORT', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: 'pCFim5mJwKkzuIR-FEPc5A', + source_type: 'company', + source_label: 'SHAOXING VISA-SX IMPORT AND EXPORT ROOM', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: 'a3HctbpFY_NInQEyIfw4ZQ', + source_type: 'company', + source_label: 'WUXI HUIHUANG GARMENT CO.,LTD RM', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: 'PLgW3xdOuwzSnV1AVDVLEg', + source_type: 'company', + source_label: 'VASEN INTERNATIONAL LTD', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: 'Yh93aIJyM7H30-z3JW29rQ', + source_type: 'company', + source_label: 'NANCHANG KANGYE CLOTHING CO.,LTD.', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: 'xoBwJxNRu-ywDXhQ27O4zQ', + source_type: 'company', + source_label: 'RADIAL INTERNATIONAL LTD. ( UNIT 2 ZIRANI BAZAR,', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: 'qY9kSlLUCBE-PiU4JD7QOQ', + source_type: 'company', + source_label: 'MARIS(H.K)SPORTS GOODS CO.,LIMITED FLAT C', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: '9Ir2xeGZTnwFbp2B6UAXMg', + source_type: 'company', + source_label: 'NANCHANG KANGYE CLOTHING CO.,LTD. CHANG DONG INDUSTRIAL ZONE,', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: 'S9I-YBojGL4hGbAw3pCDvQ', + source_type: 'company', + source_label: 'GUANGZHOU YING TAI PACKING CO.,LTD ROOM', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: 'pAqBOnuxDYCzkYulTlel4w', + source_type: 'company', + source_label: 'ZHEJINAG LEO&JERRY INTERNATIONAL ROOM A', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: '8U_n94QllNedUaHoQKlk4Q', + source_type: 'company', + source_label: 'JINJIANG HONGXING FASHION WEAVING', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: 'XoCPPJ_7kRnLzP7Qxpom6w', + source_type: 'company', + source_label: 'WUXI LIJING APPAREL CO.,LTD RM', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: 'IYO-Sml1WNrIB9SAta9WKA', + source_type: 'company', + source_label: 'NRN FASHION', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: 'us-YXVRb-jqBejotNJSeOg', + source_type: 'company', + source_label: 'LANGSHI GRAMENTS AND WEAVING CO LTD', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: '2_WvXovlFzvuLlB-SxH0VQ', + source_type: 'company', + source_label: 'YONGKANG JACKOK SPORT GOODS ENTERPRISE FENGSHANZUI INDUSTRY', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: 'uHEEPFjo1hGXytZhtO2VMw', + source_type: 'company', + source_label: 'ZHONG QIAN (GZ) AQUATIC SPORTS RM', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: '_gmHn1hbswM9dDk-ChfVig', + source_type: 'company', + source_label: 'LANGSHI GRAMENTS &WEAVING CO.,LTD', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: 'MKU0paYPbq84EZZ8wAUI2A', + source_type: 'company', + source_label: 'LANGSHI GRAMENTS &WEAVING CO.,LTD SANOU INDUSTRIAL ZONE,YINGLIN', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: 'TXqzK158yR_HNsRdp4ZWIQ', + source_type: 'company', + source_label: 'MARIS(H.K)SPORTS GOODS CO.,LIMITED RM', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: '-ys5KWTHG2mym-cf0JAfig', + source_type: 'company', + source_label: 'LANGSHI GRAMENTS WEAVING CO.,LTD JINJIANG', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: '9LprkMjlCamhO12h6G_qKA', + source_type: 'company', + source_label: 'JINJIANG HONGXING FASHION WEAVING NO', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: 'Bxpg-E90vIyRVD5r_gqdNA', + source_type: 'company', + source_label: 'LUCKY TEXTILE MILLS LIMITED', + target: 'cDn2I1Dhnqj5Nos6xLMQxQ', + target_type: 'company', + target_label: 'DIBELLA B.V.', + field: 'ships_to' + }, + { + source: 'w3mbOSsnfEVvAUuRmAfIkw', + source_type: 'company', + source_label: 'MORITO SCOVILL AMERICAS, LLC', + target: 'Bxpg-E90vIyRVD5r_gqdNA', + target_type: 'company', + target_label: 'LUCKY TEXTILE MILLS LIMITED', + field: 'ships_to' + }, + { + source: 'k9yiaeS4EANKlJlZN1qS9Q', + source_type: 'company', + source_label: 'CHANGSHU TONGGAO MARKETING CO LTD', + target: 'w3mbOSsnfEVvAUuRmAfIkw', + target_type: 'company', + target_label: 'MORITO SCOVILL AMERICAS, LLC', + field: 'ships_to' + }, + { + source: '7htrbTtdrjLqKOeY8aRmvg', + source_type: 'company', + source_label: 'OISHI INDUSTRIES VIET NAM CO LTD', + target: 'w3mbOSsnfEVvAUuRmAfIkw', + target_type: 'company', + target_label: 'MORITO SCOVILL AMERICAS, LLC', + field: 'ships_to' + }, + { + source: 'Gn9tAwz1K3vE8CW8vOFCMA', + source_type: 'person', + source_label: 'Chi Nhánh Tổng Công Ty Liksin - Xí Nghiệp Bao Bì Liksin', + target: 'FIdog3J2WSI6M9hRhKVF9A', + target_type: 'company', + target_label: 'CONG TY TNHH GUNZE VIET NAM', + field: 'ships_to' + }, + { + source: 'uhzL27CzUhEp4__oYjuzzw', + source_type: 'company', + source_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + target: 'Gn9tAwz1K3vE8CW8vOFCMA', + target_type: 'person', + target_label: 'Chi Nhánh Tổng Công Ty Liksin - Xí Nghiệp Bao Bì Liksin', + field: 'ships_to' + }, + { + source: 'uSJzsEbnl7o-eBPBdTwWMQ', + source_type: 'company', + source_label: 'CONG TY TNHH DIEN - DIEN LANH PHUONG DONG', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'prcQUlvKOFtoBtyNBGUNkQ', + source_type: 'company', + source_label: 'CôNG TY TNHH TONY GOLDEN BEES', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'zCKtjZbudfvygUwJNkL8ng', + source_type: 'company', + source_label: 'CONG TY TNHH SAN XUAT - THUONG MAI & DICH VU HD', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'Ue7_6j-AKdfz79pAOJvTDg', + source_type: 'company', + source_label: 'CONG TY TNHH TM DV SX KY THUAT THI CONG CO DIEN LANH SAI GON', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'wXejiXrM2Rxc9zNb52fVJg', + source_type: 'company', + source_label: 'CONG TY TNHH THUONG MAI VA DICH VU ANH VU V N N', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'vtEsCjq2splJwsJfBYX45g', + source_type: 'company', + source_label: 'CONG TY TNHH THUC PHAM HUU CO VIET NAM', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'Hu9sy86JkVmjWLEwO0eBPw', + source_type: 'company', + source_label: 'QINGDAO SHENG ZHI HAN AGRICULTURAL DEVELOPMENT CO., LTD.', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'q8WEQmF3LQZFYQRkZls4lA', + source_type: 'company', + source_label: 'CONG TY CO PHAN DAU TU HOP THANH PHAT', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'ByY-nOHaGpqeCt5WDkq5eQ', + source_type: 'company', + source_label: 'QINGDAO GLAD ENGIEERING TECHNOLOGY', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'LmvEWavRdHzpsmess7wXqA', + source_type: 'company', + source_label: 'CONG TY TNHH EKIDEN VIET NAM', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'IqbzAc9MwbIWHO0fee68aQ', + source_type: 'company', + source_label: 'FRUITSMART', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'BqQyAEdwqU6P_I7sCLFp3A', + source_type: 'person', + source_label: 'CHI NHANH TONG CONG TY LIKSIN - XI NGHIEP BAO BI AN KHANG LIKSIN', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'Wl3rTlfFYn6UQ_p8lowM8Q', + source_type: 'person', + source_label: 'CHI NHANH TONG CONG TY LIKSIN - XI NGHIEP BAO BI LIKSIN', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: '2yYoYhvhDzd94B1wkUIOMA', + source_type: 'company', + source_label: 'CHI NHANH CONG TY CP DAU THUC VAT TUONG AN - NHA MAY DAU PHU MY', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: '7cgv3mjIjRZ13wv8cT2Yag', + source_type: 'company', + source_label: 'CÔNG TY TRÁCH NHIỆM HỮU HẠN HO DO', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'RIT8pfvcFkxX_ZdoWilGKA', + source_type: 'company', + source_label: 'ICA S.P.A', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'xPnJLoVG-m9dVlotIZDTeQ', + source_type: 'company', + source_label: 'CôNG TY TNHH AN PHươNG TECHNOLOGY', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'AkcjhIEiNiO-mWUmcnticw', + source_type: 'company', + source_label: 'CONG TY TNHH THUONG MAI DICH VU KY THUAT PHUC SANG MINH', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'VHkFwGrmL5lxeJjnzC61yA', + source_type: 'company', + source_label: 'CÔNG TY TNHH BẢO AN', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'vFLTafXmjp5whVNy6E3s_w', + source_type: 'company', + source_label: 'NOIDA FABCON MACHINES (P) LTD', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'Qu8geiEofMXheLVPlQCAdw', + source_type: 'company', + source_label: 'SURAJ AGIMPEX HOUSE', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'seUhUlovi6ZSnisSmtbZag', + source_type: 'company', + source_label: 'VINAY INDUSTRIES LTD', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'm_aKEiRErMPoOXxJ-z5Qmg', + source_type: 'company', + source_label: 'CONTG TY CO PHAN DAU TU CONG NGHIEP SAI GON', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: '-e26_QXeiZ_tnPo3fLiPOQ', + source_type: 'company', + source_label: 'ZIBO DEROLA HOUSEWARE.COM', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'OrkIXANS3-VPU-uuSw2PJQ', + source_type: 'company', + source_label: 'CONG TY TNHH THUONG MAI DICH VU LAM GIA PHU', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'hBRLkpW4Kv-C6lWjA6NB3g', + source_type: 'company', + source_label: 'HWA HENG LEE SDN BHD', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'unabDq3OjFNc9QTqU5Csmg', + source_type: 'company', + source_label: 'CONG TY CO PHAN DAU TU PHAT TRIEN SAN XUAT MIEN NAM', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'QBdB0pCd9ktNaLkGSPWSdw', + source_type: 'company', + source_label: 'Công Ty Cổ Phần Đầu Tư Phát Triển Sản Xuất Miền Nam', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: '4T-hDsY1UmUwiTKPaQovTg', + source_type: 'company', + source_label: 'CONG TY TNHH MOT THANH VIEN MAY DONG GOI Q.A', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'I22NCQpBLwAFzQZOokNGqQ', + source_type: 'company', + source_label: 'CONG TY CO PHAN HUNG PHUONG', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: '0SiOqPrsFo8_TdA1Y7aqBg', + source_type: 'company', + source_label: 'CÔNG TY CỔ PHẦN CÔNG NGHỆ BIZFONE', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'Uly7G9_wjrYGLFIbgt6Jvg', + source_type: 'company', + source_label: 'CONG TY TNHH TM CO DIEN TU VIETTECH', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'w4SLTlNgEJk8THOLcNuolQ', + source_type: 'company', + source_label: 'CONG TY TNHH THUONG MAI DICH VU XUAT NHAP KHAU GOLDNUTS', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: '20E5FyKWwxKYMIZXM23myg', + source_type: 'company', + source_label: 'FL USA', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'sMnf1Y7IZqkkQtatFSrc5w', + source_type: 'company', + source_label: 'GRATEFOOD CO', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'P6Wtazq4zHk21NZTgMKiPA', + source_type: 'company', + source_label: 'CONG TY TNHH MOT THANH VIEN CO KHI XAY DUNG NHAT THANH', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'dIm7pEgnwdkhnmcWbNaUnQ', + source_type: 'company', + source_label: 'CÔNG TY TNHH TIẾP VẬN CONTAINER RỒNG ĐỎ', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'CUr9cjpiDfgSPvRyaxNB0Q', + source_type: 'company', + source_label: 'CONG TY TNHH CO KHI - SAN XUAT - THUONG MAI DAI PHUOC HUY', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: '-v6MQdJSJ_UYS3aae6izRQ', + source_type: 'company', + source_label: 'NUNZIATA TECNOLOGIE AGROALIMENTARI S.R.L.', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'YP0-VaDytSnUBMXmEBWiPA', + source_type: 'company', + source_label: 'OFI', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: '2D-Mr_wjWBe2TcaChUYZwg', + source_type: 'company', + source_label: 'MAGNA PROCESSING INDUSTRIES (PRIVATE) LIMITED', + target: '10U5Etnn_K53zndMOlOQcg', + target_type: 'company', + target_label: 'B & D TEXTILES GMBH', + field: 'ships_to' + }, + { + source: 'YapOmucDnADGforvDfIlQA', + source_type: 'company', + source_label: 'Crimson Middle East FZ-LLC', + target: '2D-Mr_wjWBe2TcaChUYZwg', + target_type: 'company', + target_label: 'MAGNA PROCESSING INDUSTRIES (PRIVATE) LIMITED', + field: 'ships_to' + }, + { + source: 'KYMPVbdyYDEkSaxAGsX8jw', + source_type: 'company', + source_label: 'M/S CRYSTALLINE CHEMICAL INDUSTRIES (PVT) LTD', + target: 'YapOmucDnADGforvDfIlQA', + target_type: 'company', + target_label: 'Crimson Middle East FZ-LLC', + field: 'ships_to' + }, + { + source: 'lL9wLO3YqbM8nrhfR-rLyg', + source_type: 'company', + source_label: 'ILSHIN VIETNAM CO LTD', + target: 'gdAQnpO4Ur8gdyHPPic-3g', + target_type: 'company', + target_label: 'Gul Ahmed Textile Mills Ltd', + field: 'ships_to' + }, + { + source: '4v2gb4GRgim65mKbz3Rx_Q', + source_type: 'company', + source_label: 'CARGILL INDIA PRIVATE LIMITED', + target: 'lL9wLO3YqbM8nrhfR-rLyg', + target_type: 'company', + target_label: 'ILSHIN VIETNAM CO LTD', + field: 'ships_to' + }, + { + source: 'Zi_kc6HOxUUyQXuztqgq5g', + source_type: 'company', + source_label: 'CARGILL SIAM LIMITED', + target: '4v2gb4GRgim65mKbz3Rx_Q', + target_type: 'company', + target_label: 'CARGILL INDIA PRIVATE LIMITED', + field: 'ships_to' + }, + { + source: 'RxPiKR6MmsefnQwTWioYFQ', + source_type: 'company', + source_label: 'ALLIGATOR AUTOMATIONS', + target: 'Zi_kc6HOxUUyQXuztqgq5g', + target_type: 'company', + target_label: 'CARGILL SIAM LIMITED', + field: 'ships_to' + }, + { + source: 'fntBHHpybQ56CR-7t8B6LQ', + source_type: 'company', + source_label: 'DUNE PACKAGING LTD', + target: 'RxPiKR6MmsefnQwTWioYFQ', + target_type: 'company', + target_label: 'ALLIGATOR AUTOMATIONS', + field: 'ships_to' + }, + { + source: 'veLGjZeYigX6RjXFQcfObw', + source_type: 'company', + source_label: 'Cocelpa Cia De Celulose E Papel Do Parana', + target: 'fntBHHpybQ56CR-7t8B6LQ', + target_type: 'company', + target_label: 'DUNE PACKAGING LTD', + field: 'ships_to' + }, + { + source: 'QGFzdyqmiK0cB9esCA0Asg', + source_type: 'company', + source_label: 'COCELPA CIA DE CELULOSE & PAPEL DO PARANA', + target: 'fntBHHpybQ56CR-7t8B6LQ', + target_type: 'company', + target_label: 'DUNE PACKAGING LTD', + field: 'ships_to' + }, + { + source: 'tXrKwvLwJwT6RaTyeVmtsA', + source_type: 'company', + source_label: 'BUNGE ASIA PTE LTD.', + target: '4v2gb4GRgim65mKbz3Rx_Q', + target_type: 'company', + target_label: 'CARGILL INDIA PRIVATE LIMITED', + field: 'ships_to' + }, + { + source: 'G2fG1hdYBVRax9fLcya8HA', + source_type: 'company', + source_label: 'CôNG TY TNHH KINH DOANH NôNG SảN VIệT NAM', + target: 'tXrKwvLwJwT6RaTyeVmtsA', + target_type: 'company', + target_label: 'BUNGE ASIA PTE LTD.', + field: 'ships_to' + }, + { + source: '_sw5QmIYZcWpIvmqLz8o_w', + source_type: 'company', + source_label: 'KICE INDUSTRIES, INC.', + target: 'G2fG1hdYBVRax9fLcya8HA', + target_type: 'company', + target_label: 'CôNG TY TNHH KINH DOANH NôNG SảN VIệT NAM', + field: 'ships_to' + }, + { + source: '6IbYeD1a_TkU-GIC33s-fw', + source_type: 'company', + source_label: 'DONGGUAN CITY LONGSHENG HARDWAR', + target: '_sw5QmIYZcWpIvmqLz8o_w', + target_type: 'company', + target_label: 'KICE INDUSTRIES, INC.', + field: 'ships_to' + }, + { + source: 'lHZn80ydV-7o77YhYaaZBw', + source_type: 'company', + source_label: 'GOLDEN AGRI INTERNATIONAL PTE LTD', + target: '4v2gb4GRgim65mKbz3Rx_Q', + target_type: 'company', + target_label: 'CARGILL INDIA PRIVATE LIMITED', + field: 'ships_to' + }, + { + source: 'MRVrgZsql7qjNzOrAgETzA', + source_type: 'company', + source_label: 'THE THAL INDUSTRIES CORPORATION LIMITED', + target: 'lHZn80ydV-7o77YhYaaZBw', + target_type: 'company', + target_label: 'GOLDEN AGRI INTERNATIONAL PTE LTD', + field: 'ships_to' + }, + { + source: '8hy5JQaRgCMigrDqeaL9cw', + source_type: 'company', + source_label: 'YOKOGAWA MIDDLE EAST & AFRICA BSC (', + target: 'MRVrgZsql7qjNzOrAgETzA', + target_type: 'company', + target_label: 'THE THAL INDUSTRIES CORPORATION LIMITED', + field: 'ships_to' + }, + { + source: 'heSIwK8lxfqFNi5lbs8xUg', + source_type: 'company', + source_label: 'PANTECH INSTRUMENTS', + target: '8hy5JQaRgCMigrDqeaL9cw', + target_type: 'company', + target_label: 'YOKOGAWA MIDDLE EAST & AFRICA BSC (', + field: 'ships_to' + }, + { + source: 'ZwnshoeI_mJRiGpqQfzcxQ', + source_type: 'company', + source_label: 'Chashma Sugar Mills Limited', + target: 'lHZn80ydV-7o77YhYaaZBw', + target_type: 'company', + target_label: 'GOLDEN AGRI INTERNATIONAL PTE LTD', + field: 'ships_to' + }, + { + source: '2RqxeQQ6eIJGsGws0fHdtA', + source_type: 'company', + source_label: 'BEACON COMMODITIES LTD.', + target: 'ZwnshoeI_mJRiGpqQfzcxQ', + target_type: 'company', + target_label: 'Chashma Sugar Mills Limited', + field: 'ships_to' + }, + { + source: 'LZTGRrF2FjYo3-xGdu_cMg', + source_type: 'company', + source_label: 'FERNS FINE FOODS PRIVATE LIMITED', + target: '2RqxeQQ6eIJGsGws0fHdtA', + target_type: 'company', + target_label: 'BEACON COMMODITIES LTD.', + field: 'ships_to' + }, + { + source: 'NhaDW7gKnsxR14FLOaW3Uw', + source_type: 'company', + source_label: 'BUNGE S.A', + target: '4v2gb4GRgim65mKbz3Rx_Q', + target_type: 'company', + target_label: 'CARGILL INDIA PRIVATE LIMITED', + field: 'ships_to' + }, + { + source: 'BkSvjycUL2nCb2ylImFYEA', + source_type: 'company', + source_label: 'BUNGE PARAGUAY SA', + target: 'NhaDW7gKnsxR14FLOaW3Uw', + target_type: 'company', + target_label: 'BUNGE S.A', + field: 'ships_to' + }, + { + source: 'ilSw6c5Yajm1dS-gXN7CyA', + source_type: 'company', + source_label: 'MACROSOURCE LLC', + target: 'BkSvjycUL2nCb2ylImFYEA', + target_type: 'company', + target_label: 'BUNGE PARAGUAY SA', + field: 'ships_to' + }, + { + source: 'NRlLXs3cy0CUnAL7Q6m0aQ', + source_type: 'company', + source_label: 'ROTEM AMFERT NEGEV WORKS LTD.', + target: 'ilSw6c5Yajm1dS-gXN7CyA', + target_type: 'company', + target_label: 'MACROSOURCE LLC', + field: 'ships_to' + }, + { + source: 'ccDnCZdzGdvbrrPfiX2c1Q', + source_type: 'company', + source_label: 'ZHEJIANG SUNFIT ADVANCED MATERIALS', + target: 'ilSw6c5Yajm1dS-gXN7CyA', + target_type: 'company', + target_label: 'MACROSOURCE LLC', + field: 'ships_to' + }, + { + source: 'L9OJrva_-5HYC6kAedkR4A', + source_type: 'company', + source_label: 'NINGBO HANGJUN INTERNATIONAL', + target: 'ilSw6c5Yajm1dS-gXN7CyA', + target_type: 'company', + target_label: 'MACROSOURCE LLC', + field: 'ships_to' + }, + { + source: '7jsPrGqOLAQ5rtJ5yABrDg', + source_type: 'company', + source_label: '75 SHEVERNOYE SHOSSE 162622 C. CHEREPOVETS, VOLOGDA REGION', + target: 'ilSw6c5Yajm1dS-gXN7CyA', + target_type: 'company', + target_label: 'MACROSOURCE LLC', + field: 'ships_to' + }, + { + source: 'v6mWRXPijyawdp6P3KddMw', + source_type: 'company', + source_label: "JSC ''APATIT'' SEVERNOYE SHOSSE, 75", + target: 'ilSw6c5Yajm1dS-gXN7CyA', + target_type: 'company', + target_label: 'MACROSOURCE LLC', + field: 'ships_to' + }, + { + source: '4VdkgBq6mNdNrrD8Rkp7Qw', + source_type: 'company', + source_label: 'SOLAR TURBINES EAME S.R.O.', + target: 'gdAQnpO4Ur8gdyHPPic-3g', + target_type: 'company', + target_label: 'Gul Ahmed Textile Mills Ltd', + field: 'ships_to' + }, + { + source: '6_mk9wkNvwoaswly1pDvUQ', + source_type: 'company', + source_label: 'OIL AND NATURAL GAS CORPORATION LIMITED', + target: '4VdkgBq6mNdNrrD8Rkp7Qw', + target_type: 'company', + target_label: 'SOLAR TURBINES EAME S.R.O.', + field: 'ships_to' + }, + { + source: 'BXkymLD-EP8oGQzw8pEcYg', + source_type: 'company', + source_label: 'DE NORA WATER TECHNOLOGIES, LLC', + target: '6_mk9wkNvwoaswly1pDvUQ', + target_type: 'company', + target_label: 'OIL AND NATURAL GAS CORPORATION LIMITED', + field: 'ships_to' + }, + { + source: 'Hl2EcfvD9B0UKLsKLHTrbQ', + source_type: 'company', + source_label: 'DE NORA ELETTRODI (SUZHOU) CO LTD', + target: 'BXkymLD-EP8oGQzw8pEcYg', + target_type: 'company', + target_label: 'DE NORA WATER TECHNOLOGIES, LLC', + field: 'ships_to' + }, + { + source: 'AkhPYIzkdy0kRpJvpp-b1A', + source_type: 'company', + source_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', + target: 'Hl2EcfvD9B0UKLsKLHTrbQ', + target_type: 'company', + target_label: 'DE NORA ELETTRODI (SUZHOU) CO LTD', + field: 'ships_to' + }, + { + source: 'i38exTOu9uZWzUc36rhNDQ', + source_type: 'company', + source_label: 'DE NORA DEUTSCHLAND GMBH , INDUSTRIESTRASSE 17 635', + target: 'AkhPYIzkdy0kRpJvpp-b1A', + target_type: 'company', + target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', + field: 'ships_to' + }, + { + source: '-6PBYPVh7xFlQ6NSelGvxA', + source_type: 'company', + source_label: 'WEIFANG BINHAI PETRO- CHEM CO., LTD NO.001001 XIAN', + target: 'AkhPYIzkdy0kRpJvpp-b1A', + target_type: 'company', + target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', + field: 'ships_to' + }, + { + source: '0PR2Cb5xQ4lv7FJ3_z8i8w', + source_type: 'company', + source_label: 'PACIFIC OLEOCHEMICALS SDN. BHD (64175-U) , PLO 285', + target: 'AkhPYIzkdy0kRpJvpp-b1A', + target_type: 'company', + target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', + field: 'ships_to' + }, + { + source: 'TT-AfLoL3VxwbukNEUZNmA', + source_type: 'company', + source_label: 'ADVANCED INDUSTRIAL SUPPLY FZE', + target: 'AkhPYIzkdy0kRpJvpp-b1A', + target_type: 'company', + target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', + field: 'ships_to' + }, + { + source: 'E0wMzPJ28DNPaGizuzU3Aw', + source_type: 'company', + source_label: 'FELDA MARKETING SERVICES SDN. BHD.', + target: 'AkhPYIzkdy0kRpJvpp-b1A', + target_type: 'company', + target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', + field: 'ships_to' + }, + { + source: 'BhyzJT9ITOKURmmgvFMNrw', + source_type: 'company', + source_label: 'INDIX S.R.L. , VIALE RESTELLI 3 - 20124 MILANO ITA', + target: 'AkhPYIzkdy0kRpJvpp-b1A', + target_type: 'company', + target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', + field: 'ships_to' + }, + { + source: 'U05yDL6_DuQ5iKJ_y9orVg', + source_type: 'company', + source_label: 'EINAR WILLUMSEN A/S , ABILDAGER 23-25 2605 BRENDBY', + target: 'AkhPYIzkdy0kRpJvpp-b1A', + target_type: 'company', + target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', + field: 'ships_to' + }, + { + source: 'mRE6Vhqq60KXedNg3tLcSA', + source_type: 'company', + source_label: 'NATURAL OLEOCHEMICALS SDN BHD. , PLO 338, JALAN TE', + target: 'AkhPYIzkdy0kRpJvpp-b1A', + target_type: 'company', + target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', + field: 'ships_to' + }, + { + source: 'VRxaYpmhafLw8u7mCTIRbg', + source_type: 'company', + source_label: 'GUIZHOU REDSTAR DEVELOPING IMPORT& , EXPORT CO.,LT', + target: 'AkhPYIzkdy0kRpJvpp-b1A', + target_type: 'company', + target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', + field: 'ships_to' + }, + { + source: 'ZaGELahXdbePiEB9GFKUoQ', + source_type: 'company', + source_label: 'GUIZHOU REDSTAR DEVELOPING , IMPORT AND EXPORT CO.', + target: 'AkhPYIzkdy0kRpJvpp-b1A', + target_type: 'company', + target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', + field: 'ships_to' + }, + { + source: 'DXyt2riAdby5RMyOmF549Q', + source_type: 'company', + source_label: 'ISTANBUL OZGE MAKINA SAN TIC LTD , STI 19 MAYIS MA', + target: 'AkhPYIzkdy0kRpJvpp-b1A', + target_type: 'company', + target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', + field: 'ships_to' + }, + { + source: 'jQWfEzf_ma9DAa1_clcbJA', + source_type: 'company', + source_label: 'WEIFANG BINHAI PETRO- CHEM CO., LTD , NO.001001 XIA', + target: 'AkhPYIzkdy0kRpJvpp-b1A', + target_type: 'company', + target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', + field: 'ships_to' + }, + { + source: 'PE11z7lEBa9fkGpZFMM8SA', + source_type: 'company', + source_label: 'GIVAUDAN MEA FZE , U.A.E.', + target: 'AkhPYIzkdy0kRpJvpp-b1A', + target_type: 'company', + target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', + field: 'ships_to' + }, + { + source: 'EotulGFZHVjdkzqKf6PDMw', + source_type: 'company', + source_label: 'TRADERICH INTERNATIONAL SDN. BHD.', + target: 'AkhPYIzkdy0kRpJvpp-b1A', + target_type: 'company', + target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', + field: 'ships_to' + }, + { + source: 'G3ExzlsuCUNbSWIk5TWBoQ', + source_type: 'company', + source_label: 'FRUTAROM ETOL D.O.O. , SKOFJA VAS 39 3211 SKOFJA V', + target: 'AkhPYIzkdy0kRpJvpp-b1A', + target_type: 'company', + target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', + field: 'ships_to' + }, + { + source: 'P8IoXQxhzW7mypvYPet6Eg', + source_type: 'person', + source_label: 'AEROSOL MAKINE TEKNOLOJILERI BARIS ELVAN KESME VE', + target: 'AkhPYIzkdy0kRpJvpp-b1A', + target_type: 'company', + target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', + field: 'ships_to' + }, + { + source: 'u77EzCcGCo3kxHqsj64QMA', + source_type: 'company', + source_label: 'IMEX LIMITED RM 905 WORKINGBERG , COMM BLDG,41-47', + target: 'AkhPYIzkdy0kRpJvpp-b1A', + target_type: 'company', + target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', + field: 'ships_to' + }, + { + source: 'IOBmkChDd4KKK5EbOln1wA', + source_type: 'company', + source_label: 'PALM-OLEO SDN BHD , LOT 1245 KUNDANG INDUSTRIAL ES', + target: 'AkhPYIzkdy0kRpJvpp-b1A', + target_type: 'company', + target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', + field: 'ships_to' + }, + { + source: 'BN3PFTbF0dOCIhWGf4MS6g', + source_type: 'company', + source_label: 'EVYP SABUN MALAYSIA SDN BHD', + target: 'AkhPYIzkdy0kRpJvpp-b1A', + target_type: 'company', + target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', + field: 'ships_to' + }, + { + source: 'SouCCM-pSXPTbZhHHn15Zg', + source_type: 'company', + source_label: 'NANTONG TONGJI CO LTD , NO 19 DASHENG ROAD NANTONG', + target: 'AkhPYIzkdy0kRpJvpp-b1A', + target_type: 'company', + target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', + field: 'ships_to' + }, + { + source: 'DrTJoyNpi8qFPtfpuSjMMQ', + source_type: 'company', + source_label: 'SOUTHERN ACIDS INDUSTRIES SDN. BHD. , LEVEL 29, CE', + target: 'AkhPYIzkdy0kRpJvpp-b1A', + target_type: 'company', + target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', + field: 'ships_to' + }, + { + source: 'zX0iUjcA2GoGH3EO10Mgcg', + source_type: 'company', + source_label: 'JIANGXI JINKE INTERNATIONAL TRADE CO ., LTD , ROOM', + target: 'AkhPYIzkdy0kRpJvpp-b1A', + target_type: 'company', + target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', + field: 'ships_to' + }, + { + source: 'nbbne4ljdN8t8Vx2S7RwfA', + source_type: 'company', + source_label: 'AGRISKY CO.,LTD , OFFICE ADDRESS:RM 1203,NO.1 BUIL', + target: 'AkhPYIzkdy0kRpJvpp-b1A', + target_type: 'company', + target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', + field: 'ships_to' + }, + { + source: 'TM_3H_lWy4q255ehpYViCA', + source_type: 'company', + source_label: 'SWISS SINGAPORE , SINGAPROE', + target: 'AkhPYIzkdy0kRpJvpp-b1A', + target_type: 'company', + target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', + field: 'ships_to' + }, + { + source: 'isPIvstXNp3vp2sRrfnS7Q', + source_type: 'company', + source_label: 'PALM-OLEO SDN BHD , LOT 1245, KUNDANG INDUSTRIAL E', + target: 'AkhPYIzkdy0kRpJvpp-b1A', + target_type: 'company', + target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', + field: 'ships_to' + }, + { + source: 'b9wtTcxCY1v0jsq4ihL2WQ', + source_type: 'company', + source_label: 'SUZHOU LONGZHENG PACKAGINGTECHNOLOGY CO.,LTD. 8 W', + target: 'AkhPYIzkdy0kRpJvpp-b1A', + target_type: 'company', + target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', + field: 'ships_to' + }, + { + source: 'Rdpk5v6jYCh7olRvO3jH2g', + source_type: 'company', + source_label: 'MEPLAST PLASTIK TEKNOLOJI SAN VE LT ESENKENT MAH.', + target: 'AkhPYIzkdy0kRpJvpp-b1A', + target_type: 'company', + target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', + field: 'ships_to' + }, + { + source: 'yTkVlCMsfPsyIFIiu9bSEA', + source_type: 'company', + source_label: 'EVYAP SABUN MALAYSIA SDN BHD , PLO 70, JALAN NIBON', + target: 'AkhPYIzkdy0kRpJvpp-b1A', + target_type: 'company', + target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', + field: 'ships_to' + }, + { + source: 'mf4uByHrdlGGtlNgVYIPXA', + source_type: 'company', + source_label: 'ADVANCE INDUSTRIAL SUPPLY FZE , AL COURNICH STR MA', + target: 'AkhPYIzkdy0kRpJvpp-b1A', + target_type: 'company', + target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', + field: 'ships_to' + } +] diff --git a/examples/left-hierarchy/index.html b/examples/hierarchy/index.html similarity index 100% rename from examples/left-hierarchy/index.html rename to examples/hierarchy/index.html diff --git a/examples/left-hierarchy/index.ts b/examples/hierarchy/index.ts similarity index 82% rename from examples/left-hierarchy/index.ts rename to examples/hierarchy/index.ts index fcf516f4..9b1a44bd 100644 --- a/examples/left-hierarchy/index.ts +++ b/examples/hierarchy/index.ts @@ -21,7 +21,6 @@ const russianLabel = 'ВИКТОР ФЕЛИКСОВИЧ ВЕКСЕЛЬБЕРГ' const createCompanyStyle = (radius: number): Graph.NodeStyle => ({ color: '#FFAF1D', stroke: [{ color: '#FFF' }, { color: '#F7CA4D' }], - label: { placement: 'right' }, icon: { type: 'textIcon' as const, family: 'Material Icons', @@ -48,7 +47,6 @@ const createCompanyStyle = (radius: number): Graph.NodeStyle => ({ const createPersonStyle = (radius: number): Graph.NodeStyle => ({ color: '#7CBBF3', stroke: [{ color: '#90D7FB' }], - label: { placement: 'right' }, icon: { type: 'textIcon' as const, family: 'Material Icons', @@ -73,9 +71,8 @@ let nodes = Object.values(graphData.nodes) })) .concat(Object.values(graphData.nodes).map((node) => ({ ...node, id: `${node.id}_2` }))) .concat(Object.values(graphData.nodes).map((node) => ({ ...node, id: `${node.id}_3` }))) - .map(({ id, label, type }) => ({ + .map(({ id, type }) => ({ id, - label, radius: 18, type, style: type === 'company' ? createCompanyStyle(18) : createPersonStyle(18) @@ -106,11 +103,10 @@ let edges = Object.entries<{ field: string; source: string; target: string }>(gr } ] ]) - .map(([id, { field, source, target }]) => ({ + .map(([id, { source, target }]) => ({ id, source, target, - label: field.replace(/_/g, ' '), style: { arrow: 'forward' } })) /** @@ -131,11 +127,20 @@ const render = WebGL.Renderer({ let index = 0 const root = nodes[0].id const size = { width: container.offsetWidth, height: container.offsetHeight } -const options: Hierarchy.Options = { x: 600, y: size.width, nodeSize: [50, 600], anchor: 'left' } +const options: Hierarchy.Options = { x: 600, y: size.width } const data = [ - hierarchy(root, { nodes, edges, options: { ...options, alignment: 'min' } }), - hierarchy(root, { nodes, edges, options: { ...options, alignment: 'mid' } }), - hierarchy(root, { nodes, edges, options: { ...options, alignment: 'max' } }) + hierarchy(root, { nodes, edges, options }), + hierarchy(root, { nodes, edges, options: { ...options, nodeSize: [100, 300], alignment: 'min' } }), + hierarchy(root, { nodes, edges, options: { ...options, nodeSize: [100, 300], alignment: 'max' } }), + hierarchy(root, { nodes, edges, options: { ...options, nodeSize: [50, 600], anchor: 'left', alignment: 'min' } }), + hierarchy(root, { nodes, edges, options: { ...options, nodeSize: [50, 600], anchor: 'left', alignment: 'mid' } }), + hierarchy(root, { nodes, edges, options: { ...options, nodeSize: [50, 600], anchor: 'left', alignment: 'max' } }), + hierarchy(root, { nodes, edges, options: { ...options, nodeSize: [50, 600], anchor: 'right', alignment: 'min' } }), + hierarchy(root, { nodes, edges, options: { ...options, nodeSize: [50, 600], anchor: 'right', alignment: 'mid' } }), + hierarchy(root, { nodes, edges, options: { ...options, nodeSize: [50, 600], anchor: 'right', alignment: 'max' } }), + hierarchy(root, { nodes, edges, options: { ...options, anchor: 'bottom' } }), + hierarchy(root, { nodes, edges, options: { ...options, nodeSize: [100, 300], anchor: 'bottom', alignment: 'min' } }), + hierarchy(root, { nodes, edges, options: { ...options, nodeSize: [100, 300], anchor: 'bottom', alignment: 'max' } }) ] const viewport = data.map((graph) => Graph.boundsToViewport(Graph.getSelectionBounds(graph.nodes, 120), size)) diff --git a/examples/index.html b/examples/index.html index f7dc3705..9414df4d 100644 --- a/examples/index.html +++ b/examples/index.html @@ -24,8 +24,7 @@
  • pixi subgraphs
  • pixi react
  • pixi icons
  • -
  • top hierarchy
  • -
  • left hierarchy
  • +
  • hierarchy
  • radial
  • collide
  • components
  • diff --git a/examples/top-hierarchy/index.html b/examples/top-hierarchy/index.html deleted file mode 100644 index ef1eb2df..00000000 --- a/examples/top-hierarchy/index.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - Graph - - - - - - -
    - - - diff --git a/examples/top-hierarchy/index.ts b/examples/top-hierarchy/index.ts deleted file mode 100644 index 72f96300..00000000 --- a/examples/top-hierarchy/index.ts +++ /dev/null @@ -1,260 +0,0 @@ -import Stats from 'stats.js' -import * as Hierarchy from '../../src/layout/hierarchy' -import * as Force from '../../src/layout/force' -import * as Graph from '../../src' -import * as Zoom from '../../src/bindings/native/zoom' -import * as WebGL from '../../src/renderers/webgl' -import graphData from '../../data/tmp-data' - -export const stats = new Stats() -stats.showPanel(0) // 0: fps, 1: ms, 2: mb, 3+: custom -document.body.appendChild(stats.dom) - -/** - * Initialize Data - */ -type Node = Graph.Node & { type: string } - -const arabicLabel = 'مدالله بن علي\nبن سهل الخالدي' -const thaiLabel = 'บริษัท ไทยยูเนียนรับเบอร์\nจำกัด' -const russianLabel = 'ВИКТОР ФЕЛИКСОВИЧ ВЕКСЕЛЬБЕРГ' - -const createCompanyStyle = (radius: number): Graph.NodeStyle => ({ - color: '#FFAF1D', - stroke: [{ color: '#FFF' }, { color: '#F7CA4D' }], - icon: { - type: 'textIcon' as const, - family: 'Material Icons', - text: 'business', - color: '#fff', - size: radius * 1.2 - }, - badge: [ - { - position: 45, - color: '#FFAF1D', - stroke: '#FFF', - icon: { type: 'textIcon', family: 'Helvetica', size: 10, color: '#FFF', text: '15' } - }, - { - position: 135, - color: '#E4171B', - stroke: '#FFF', - icon: { type: 'textIcon', family: 'Helvetica', size: 10, color: '#FFF', text: '!' } - } - ] -}) - -const createPersonStyle = (radius: number): Graph.NodeStyle => ({ - color: '#7CBBF3', - stroke: [{ color: '#90D7FB' }], - icon: { - type: 'textIcon' as const, - family: 'Material Icons', - text: 'person', - color: '#fff', - size: radius * 1.2 - }, - badge: [ - { - position: 45, - color: '#7CBBF3', - stroke: '#FFF', - icon: { type: 'textIcon', family: 'Helvetica', size: 10, color: '#FFF', text: '8' } - } - ] -}) - -let nodes = Object.values(graphData.nodes) - .map((node, idx) => ({ - ...node, - label: idx % 4 === 0 ? arabicLabel : idx % 4 === 1 ? thaiLabel : idx % 4 === 2 ? russianLabel : node.label - })) - .concat(Object.values(graphData.nodes).map((node) => ({ ...node, id: `${node.id}_2` }))) - .concat(Object.values(graphData.nodes).map((node) => ({ ...node, id: `${node.id}_3` }))) - .map(({ id, label, type }) => ({ - id, - label, - radius: 18, - type, - style: type === 'company' ? createCompanyStyle(18) : createPersonStyle(18) - })) - -let edges = Object.entries<{ field: string; source: string; target: string }>(graphData.edges) - .concat( - Object.entries(graphData.edges).map(([id, edge]) => [`${id}_2`, { ...edge, source: `${edge.source}_2`, target: `${edge.target}_2` }]) - ) - .concat( - Object.entries(graphData.edges).map(([id, edge]) => [`${id}_3`, { ...edge, source: `${edge.source}_3`, target: `${edge.target}_3` }]) - ) - .concat([ - [ - 'connect_2', - { - field: 'related_to', - source: Object.values(graphData.nodes)[77].id, - target: `${Object.values(graphData.nodes)[0].id}_2` - } - ], - [ - 'connect_3', - { - field: 'related_to', - source: `${Object.values(graphData.nodes)[50].id}_2`, - target: `${Object.values(graphData.nodes)[0].id}_3` - } - ] - ]) - .map(([id, { field, source, target }]) => ({ - id, - source, - target, - label: field.replace(/_/g, ' '), - style: { arrow: 'forward' } - })) - -let hierarchyNodes: Node[] = [] -let hierarchyEdges: Graph.Edge[] = [] - -let forceNodes: Node[] = [] -let forceEdges: Graph.Edge[] = [] - -/** - * Initialize Layout and Renderer - */ -const container = document.querySelector('#graph') as HTMLDivElement -const hierarchy = Hierarchy.Layout() -const force = Force.Layout() -const zoomControl = Zoom.Control({ container }) -const render = WebGL.Renderer({ - container, - debug: { stats, logPerformance: false } -}) - -/** - * Initialize Layout and Renderer Options - */ -const layoutOptions: Hierarchy.Options = { - y: container.offsetHeight, - x: 600 -} -const renderOptions: WebGL.Options = { - width: container.offsetWidth, - height: container.offsetHeight, - x: 0, - y: 0, - zoom: 1, - minZoom: 0.1, - maxZoom: 2.5, - onNodeDrag: ({ nodeX: x, nodeY: y, target: { id } }) => { - nodes = nodes.map((node) => (node.id === id ? { ...node, x, y } : node)) - render({ nodes, edges, options: renderOptions }) - }, - onNodePointerEnter: ({ target: { id } }) => { - nodes = nodes.map((node) => - node.id === id - ? { - ...node, - style: { - ...node.style, - stroke: node.type === 'company' ? [{ color: '#FFF' }, { color: '#CCC' }] : [{ color: '#CCC' }] - } - } - : node - ) - render({ nodes, edges, options: renderOptions }) - }, - onNodePointerLeave: ({ target: { id } }) => { - nodes = nodes.map((node) => - node.id === id - ? { - ...node, - style: node.type === 'company' ? createCompanyStyle(18) : createPersonStyle(18) - } - : node - ) - render({ nodes, edges, options: renderOptions }) - }, - onEdgePointerEnter: ({ target: { id } }) => { - edges = edges.map((edge) => (edge.id === id ? { ...edge, style: { ...edge.style, width: 3 } } : edge)) - render({ nodes, edges, options: renderOptions }) - }, - onEdgePointerLeave: ({ target: { id } }) => { - edges = edges.map((edge) => (edge.id === id ? { ...edge, style: { ...edge.style, width: 1 } } : edge)) - render({ nodes, edges, options: renderOptions }) - }, - onViewportPointerDown: () => { - if (layout === 'hierarchy') { - layout = 'force' - nodes = forceNodes - edges = forceEdges - // const { x, y, zoom } = Graph.boundsToViewport( - // Graph.getSelectionBounds(nodes, 80), - // { width: renderOptions.width!, height: renderOptions.height! } - // ) - // renderOptions.x = x - // renderOptions.y = y - // renderOptions.zoom = zoom - - render({ nodes, edges, options: renderOptions }) - } else { - layout = 'hierarchy' - nodes = hierarchyNodes - edges = hierarchyEdges - // const { x, y, zoom } = Graph.boundsToViewport( - // Graph.getSelectionBounds(nodes, 80), - // { width: renderOptions.width!, height: renderOptions.height! } - // ) - // renderOptions.x = x - // renderOptions.y = y - // renderOptions.zoom = zoom - - render({ nodes, edges, options: renderOptions }) - } - }, - onViewportDrag: ({ viewportX, viewportY }) => { - renderOptions.x = viewportX - renderOptions.y = viewportY - render({ nodes, edges, options: renderOptions }) - }, - onViewportWheel: ({ viewportX, viewportY, viewportZoom }) => { - renderOptions.x = viewportX - renderOptions.y = viewportY - renderOptions.zoom = viewportZoom - render({ nodes, edges, options: renderOptions }) - } -} - -/** - * Layout and Render Graph - */ -zoomControl({ - top: 80, - onZoomIn: () => { - renderOptions.zoom = Zoom.clampZoom(renderOptions.minZoom!, renderOptions.maxZoom!, renderOptions.zoom! / 0.6) - render({ nodes, edges, options: renderOptions }) - }, - onZoomOut: () => { - renderOptions.zoom = Zoom.clampZoom(renderOptions.minZoom!, renderOptions.maxZoom!, renderOptions.zoom! * 0.6) - render({ nodes, edges, options: renderOptions }) - } -}) - -let layout = 'hierarchy' -const hierarchyData = hierarchy(nodes[0].id, { nodes, edges, options: layoutOptions }) -nodes = hierarchyNodes = hierarchyData.nodes -edges = hierarchyEdges = hierarchyData.edges -force({ nodes, edges }).then((forceData) => { - forceNodes = forceData.nodes - forceEdges = forceData.edges - - const { x, y, zoom } = Graph.boundsToViewport(Graph.getSelectionBounds(nodes, 80), { - width: renderOptions.width!, - height: renderOptions.height! - }) - renderOptions.x = x - renderOptions.y = y - renderOptions.zoom = zoom - - render({ nodes, edges, options: renderOptions }) -}) From bfbaf11fe721068c75545794a2d63d36f6494f43 Mon Sep 17 00:00:00 2001 From: Mikey Gower Date: Tue, 19 Sep 2023 15:39:27 -0400 Subject: [PATCH 06/22] use tsc to compile package types --- examples/pixi-react/index.html | 42 +++++++++++++++++----------------- package.json | 17 ++++---------- src/renderers/webgl/node.ts | 12 ++-------- tsconfig.json | 3 +-- 4 files changed, 28 insertions(+), 46 deletions(-) diff --git a/examples/pixi-react/index.html b/examples/pixi-react/index.html index f5918307..ef1eb2df 100644 --- a/examples/pixi-react/index.html +++ b/examples/pixi-react/index.html @@ -1,24 +1,24 @@ - - - Graph - - - - - - -
    - - + + + Graph + + + + + + +
    + + diff --git a/package.json b/package.json index 1361cb20..22d82570 100644 --- a/package.json +++ b/package.json @@ -5,10 +5,8 @@ "source": "src/index.ts", "main": "./dist/main.js", "module": "./dist/module.js", - "types": "./dist/types.d.ts", - "files": [ - "dist" - ], + "types": "./dist/index.d.ts", + "files": ["dist"], "scripts": { "clean": "rm -rf dist && rm -rf .parcel-cache", "format": "prettier . --write", @@ -18,7 +16,7 @@ "lint:fix": "eslint \"src/**/**.{ts,tsx}\" --fix", "perf": "parcel perf/index.html", "build:tsc": "tsc --project ./tsconfig.json", - "build": "npm run clean && npm run build:tsc && parcel build", + "build": "npm run clean && parcel build && npm run build:tsc", "examples:dev": "npm run clean && parcel examples/index.html", "docs:dev": "npm run clean && parcel docs-src/index.html", "docs:build": "rm -rf ./docs/ && parcel build ./docs-src/index.html --dist-dir docs/ --public-url https://sayari-analytics.github.io/trellis/ && cp ./docs-src/assets/og-image.png ./docs/" @@ -70,14 +68,7 @@ "ts-loader": "^6.2.2", "typescript": "^5.2.2" }, - "keywords": [ - "graph", - "network", - "infovis", - "visualization", - "react", - "webgl" - ], + "keywords": ["graph", "network", "infovis", "visualization", "react", "webgl"], "peerDependencies": { "react": ">=16.0" }, diff --git a/src/renderers/webgl/node.ts b/src/renderers/webgl/node.ts index bfeaf2ea..05e3b940 100644 --- a/src/renderers/webgl/node.ts +++ b/src/renderers/webgl/node.ts @@ -213,10 +213,7 @@ export class NodeRenderer { this.dirty = true this.renderer.dirty = true - const anchor = - this.labelPlacement === 'left' || this.labelPlacement === 'right' - ? HORIZONTAL_ANCHOR - : VERTICAL_ANCHOR + const anchor = this.labelPlacement === 'left' || this.labelPlacement === 'right' ? HORIZONTAL_ANCHOR : VERTICAL_ANCHOR this.labelSprite = new PIXI.Text(this.label, { fontFamily: this.labelFamily, @@ -225,12 +222,7 @@ export class NodeRenderer { lineJoin: 'round', stroke: this.labelBackground === undefined ? '#fff' : undefined, strokeThickness: this.labelBackground === undefined ? 2.5 * 2.5 : 0, - align: - this.labelPlacement === 'left' - ? 'right' - : this.labelPlacement === 'right' - ? 'left' - : 'center', + align: this.labelPlacement === 'left' ? 'right' : this.labelPlacement === 'right' ? 'left' : 'center', wordWrap: labelWordWrap !== undefined, wordWrapWidth: labelWordWrap }) diff --git a/tsconfig.json b/tsconfig.json index 2da2a4ab..e6e47c0f 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -60,6 +60,5 @@ // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ }, - "include": ["src/**/*"], - "exclude": ["src/index.ts"] + "include": ["src/**/*"] } From 361e05fe39a377e804aaaec2698a608c4abbdbfa Mon Sep 17 00:00:00 2001 From: Mikey Gower Date: Mon, 18 Sep 2023 16:55:27 -0400 Subject: [PATCH 07/22] add sorting option to hierarchy layout --- src/layout/hierarchy/index.ts | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/layout/hierarchy/index.ts b/src/layout/hierarchy/index.ts index 0da5adfa..78cad120 100644 --- a/src/layout/hierarchy/index.ts +++ b/src/layout/hierarchy/index.ts @@ -1,17 +1,18 @@ import type { Node, Edge, Placement } from '../../trellis' import { findAncestor, hierarchyToGraph, graphToBFSHierarchy, graphToDFSHierarchy, Hierarchy } from './utils' -import { HierarchyPointNode, hierarchy } from 'd3-hierarchy' +import { HierarchyNode, HierarchyPointNode, hierarchy } from 'd3-hierarchy' import tree from './tree' export type Options = Partial<{ x: number y: number - nodeSize: [number, number] - size: [number, number] - separation: (a: HierarchyPointNode, b: HierarchyPointNode) => number bfs: boolean anchor: Placement alignment: 'min' | 'mid' | 'max' + size: [number, number] + nodeSize: [number, number] + separation: (a: HierarchyPointNode, b: HierarchyPointNode) => number + sort: (a: HierarchyNode, b: HierarchyNode) => number }> export const DEFAULT_NODE_SIZE: [number, number] = [120, 240] @@ -56,10 +57,13 @@ export const Layout = () => { layout.alignment(graph.options.alignment) } - const positionedDataById = hierarchyToGraph(layout(root)) + if (graph.options?.sort !== undefined) { + root.sort(graph.options.sort) + } - const { x = 0, y = 0 } = graph.nodes.find((node) => node.id === _root) ?? {} + const positionedDataById = hierarchyToGraph(layout(root)) + const { x = 0, y = 0 } = graph.nodes.find((node) => node.id === rootId) ?? {} const xOffset = (graph.options?.x ?? 0) + x const yOffset = (graph.options?.y ?? 0) - y From fa7b455cb3930f4d45fc1da74a76f1315127d6e2 Mon Sep 17 00:00:00 2001 From: Mikey Gower Date: Tue, 19 Sep 2023 13:11:29 -0400 Subject: [PATCH 08/22] enhance hierarchy data with complete node data --- examples/hierarchy/index.ts | 2 +- src/layout/hierarchy/index.d.ts | 21 +++++ src/layout/hierarchy/index.ts | 31 ++++--- src/layout/hierarchy/tree/index.d.ts | 3 +- src/layout/hierarchy/utils.ts | 133 +++++++++++++++++++++++---- 5 files changed, 157 insertions(+), 33 deletions(-) create mode 100644 src/layout/hierarchy/index.d.ts diff --git a/examples/hierarchy/index.ts b/examples/hierarchy/index.ts index 9b1a44bd..8eb6b560 100644 --- a/examples/hierarchy/index.ts +++ b/examples/hierarchy/index.ts @@ -127,7 +127,7 @@ const render = WebGL.Renderer({ let index = 0 const root = nodes[0].id const size = { width: container.offsetWidth, height: container.offsetHeight } -const options: Hierarchy.Options = { x: 600, y: size.width } +const options: Hierarchy.Options = { x: 600, y: size.width } const data = [ hierarchy(root, { nodes, edges, options }), hierarchy(root, { nodes, edges, options: { ...options, nodeSize: [100, 300], alignment: 'min' } }), diff --git a/src/layout/hierarchy/index.d.ts b/src/layout/hierarchy/index.d.ts new file mode 100644 index 00000000..ebffea1d --- /dev/null +++ b/src/layout/hierarchy/index.d.ts @@ -0,0 +1,21 @@ +import { HierarchyNode, HierarchyPointNode } from 'd3-hierarchy' +import type { Node, Edge, Placement } from '../../trellis' +import type { HierarchyData } from './utils' +import type { Extend } from '../../types' + +export type Options = Partial<{ + x: number + y: number + bfs: boolean + anchor: Placement + alignment: 'min' | 'mid' | 'max' + size: [number, number] + nodeSize: [number, number] + separation: (a: HierarchyPointNode>, b: HierarchyPointNode>) => number + sort: (a: HierarchyNode>, b: HierarchyNode>) => number +}> + +export function Layout(): ( + root: string, + graph: { nodes: N[]; edges: E[]; options?: Options } +) => { edges: E[]; nodes: Extend[] } diff --git a/src/layout/hierarchy/index.ts b/src/layout/hierarchy/index.ts index 78cad120..84180f51 100644 --- a/src/layout/hierarchy/index.ts +++ b/src/layout/hierarchy/index.ts @@ -1,9 +1,9 @@ import type { Node, Edge, Placement } from '../../trellis' -import { findAncestor, hierarchyToGraph, graphToBFSHierarchy, graphToDFSHierarchy, Hierarchy } from './utils' +import { findAncestor, hierarchyToGraph, createGraphIndex, graphToHierarchy, HierarchyData } from './utils' import { HierarchyNode, HierarchyPointNode, hierarchy } from 'd3-hierarchy' import tree from './tree' -export type Options = Partial<{ +export type Options = Partial<{ x: number y: number bfs: boolean @@ -11,14 +11,16 @@ export type Options = Partial<{ alignment: 'min' | 'mid' | 'max' size: [number, number] nodeSize: [number, number] - separation: (a: HierarchyPointNode, b: HierarchyPointNode) => number - sort: (a: HierarchyNode, b: HierarchyNode) => number + separation: (a: HierarchyPointNode>, b: HierarchyPointNode>) => number + sort: (a: HierarchyNode>, b: HierarchyNode>) => number }> -export const DEFAULT_NODE_SIZE: [number, number] = [120, 240] +const DEFAULT_NODE_SIZE: [number, number] = [120, 240] export const Layout = () => { - return (_root: string, graph: { nodes: N[]; edges: E[]; options?: Options }) => { + return (_root: string, graph: { nodes: N[]; edges: E[]; options?: Options }) => { + const index = createGraphIndex(graph) + const edgeIndex = graph.edges.reduce>((edgeIndex, edge) => { if (edgeIndex[edge.source] === undefined) { edgeIndex[edge.source] = [] @@ -35,12 +37,17 @@ export const Layout = () => { const rootId = edgeIndex[_root] === undefined ? findAncestor(graph.nodes, _root) ?? _root : _root - if (edgeIndex[rootId] === undefined) { + if (index[rootId] === undefined) { return { nodes: graph.nodes, edges: graph.edges } } - const root = hierarchy(graph.options?.bfs !== false ? graphToBFSHierarchy(edgeIndex, rootId) : graphToDFSHierarchy(edgeIndex, rootId)) - const layout = tree() + const root = hierarchy(graphToHierarchy(index, rootId, graph.options?.bfs)) + + if (graph.options?.sort !== undefined) { + root.sort(graph.options.sort) + } + + const layout = tree>() const nodeSize = graph.options?.nodeSize ?? DEFAULT_NODE_SIZE if (graph.options?.size !== undefined) { @@ -57,13 +64,9 @@ export const Layout = () => { layout.alignment(graph.options.alignment) } - if (graph.options?.sort !== undefined) { - root.sort(graph.options.sort) - } - const positionedDataById = hierarchyToGraph(layout(root)) - const { x = 0, y = 0 } = graph.nodes.find((node) => node.id === rootId) ?? {} + const { x = 0, y = 0 } = index[rootId].node const xOffset = (graph.options?.x ?? 0) + x const yOffset = (graph.options?.y ?? 0) - y diff --git a/src/layout/hierarchy/tree/index.d.ts b/src/layout/hierarchy/tree/index.d.ts index e5190b13..03337df0 100644 --- a/src/layout/hierarchy/tree/index.d.ts +++ b/src/layout/hierarchy/tree/index.d.ts @@ -1,7 +1,6 @@ import { TreeLayout as HierarchyTreeLayout } from 'd3-hierarchy' -import { Hierarchy } from '../utils' interface TreeLayout extends HierarchyTreeLayout { alignment: (alignment: 'min' | 'max' | 'mid') => this } -export default function (): TreeLayout +export default function (): TreeLayout diff --git a/src/layout/hierarchy/utils.ts b/src/layout/hierarchy/utils.ts index 271c7113..287d7db6 100644 --- a/src/layout/hierarchy/utils.ts +++ b/src/layout/hierarchy/utils.ts @@ -1,31 +1,132 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ import { HierarchyPointNode } from 'd3-hierarchy' -import type { Node } from '../../trellis' +import type { Node, Edge } from '../../trellis' // types -export type Hierarchy = { id: string; children: Hierarchy[] } +export type TreePath = { edge: E; node: N } + +export type GraphIndex = Record + +export type HierarchyData = ({ root: true; node: N; edge: null } | { root: false; node: N; edge: E }) & { + children: HierarchyData[] +} + +// v1 +export type HierarchyV1 = { id: string; children: HierarchyV1[] } // utils -const _graphToDFSHierarchy = (edgeIndex: Record, id: string, visited: Set): Hierarchy => { +export const indexById = (items: T[]) => { + const lookup: Record = {} + for (const item of items) { + lookup[item.id] = item + } + return lookup +} + +export const createGraphIndex = (graph: { nodes: N[]; edges: E[] }) => { + const nodes = indexById(graph.nodes) + + return graph.edges.reduce>((index, edge) => { + if (nodes[edge.source] !== undefined && nodes[edge.target] !== undefined) { + if (index[edge.source] === undefined) { + index[edge.source] = { node: nodes[edge.source], paths: [] } + } + index[edge.source].paths.push({ edge, node: nodes[edge.target] }) + + if (index[edge.target] === undefined) { + index[edge.target] = { node: nodes[edge.target], paths: [] } + } + index[edge.target].paths.push({ edge, node: nodes[edge.source] }) + } + + return index + }, {}) +} + +export const graphToBFSHierarchy = (index: GraphIndex, rootId: string): HierarchyData => { + const children: HierarchyData[] = [] + + const queue: [string, HierarchyData[]][] = [[rootId, children]] + const visited = new Set([rootId]) + + while (queue.length > 0) { + const [id, children] = queue.shift()! + for (const { node, edge } of index[id].paths) { + if (!visited.has(node.id)) { + visited.add(node.id) + const grandChildren: HierarchyData[] = [] + children.push({ root: false, edge, node, children: grandChildren }) + queue.push([node.id, grandChildren]) + } + } + } + + return { node: index[rootId].node, root: true, edge: null, children } +} + +export const graphToDFSHierarchy = ( + index: GraphIndex, + node: N, + edge: E | null, + visited = new Set() +): HierarchyData => { + visited.add(node.id) + + const children: HierarchyData[] = [] + + for (const path of index[node.id].paths) { + if (!visited.has(path.node.id)) { + children.push(graphToDFSHierarchy(index, path.node, path.edge, visited)) + } + } + + return edge === null ? { root: true, node, edge, children } : { root: false, node, edge, children } +} + +export const graphToHierarchy = ( + index: GraphIndex, + rootId: string, + bfs = true +): HierarchyData => { + return bfs ? graphToBFSHierarchy(index, rootId) : graphToDFSHierarchy(index, index[rootId].node, null) +} + +export const hierarchyToGraph = ( + hierarchy: HierarchyPointNode>, + nodesById: Record>> = {} +) => { + nodesById[hierarchy.data.node.id] = hierarchy + + if (hierarchy.children !== undefined) { + for (const child of hierarchy.children) { + hierarchyToGraph(child, nodesById) + } + } + + return nodesById +} + +const _graphToDFSHierarchyV1 = (edgeIndex: Record, id: string, visited: Set): HierarchyV1 => { visited.add(id) - const children: Hierarchy[] = [] + const children: HierarchyV1[] = [] for (const child of edgeIndex[id]) { if (!visited.has(child)) { - children.push(_graphToDFSHierarchy(edgeIndex, child, visited)) + children.push(_graphToDFSHierarchyV1(edgeIndex, child, visited)) } } return { id, children } } -export const graphToDFSHierarchy = (edgeIndex: Record, id: string): Hierarchy => - _graphToDFSHierarchy(edgeIndex, id, new Set()) +export const graphToDFSHierarchyV1 = (edgeIndex: Record, id: string): HierarchyV1 => + _graphToDFSHierarchyV1(edgeIndex, id, new Set()) -export const graphToBFSHierarchy = (edgeIndex: Record, id: string): Hierarchy => { - const children: Hierarchy['children'] = [] +export const graphToBFSHierarchyV1 = (edgeIndex: Record, id: string): HierarchyV1 => { + const children: HierarchyV1['children'] = [] - const queue: (readonly [string, Hierarchy['children']])[] = [[id, children]] + const queue: (readonly [string, HierarchyV1['children']])[] = [[id, children]] const visited = new Set([id]) @@ -35,7 +136,7 @@ export const graphToBFSHierarchy = (edgeIndex: Record, id: str for (const child of edgeIndex[id]) { if (!visited.has(child)) { visited.add(child) - const grandChildren: Hierarchy['children'] = [] + const grandChildren: HierarchyV1['children'] = [] children.push({ id: child, children: grandChildren }) queue.push([child, grandChildren] as const) } @@ -48,22 +149,22 @@ export const graphToBFSHierarchy = (edgeIndex: Record, id: str } } -const _hierarchyToGraph = ( - hierarchy: HierarchyPointNode, - nodesById: Record | undefined> +const _hierarchyToGraphV1 = ( + hierarchy: HierarchyPointNode, + nodesById: Record | undefined> ) => { nodesById[hierarchy.data.id] = hierarchy if (hierarchy.children !== undefined) { for (const child of hierarchy.children) { - _hierarchyToGraph(child, nodesById) + _hierarchyToGraphV1(child, nodesById) } } return nodesById } -export const hierarchyToGraph = (hierarchy: HierarchyPointNode) => _hierarchyToGraph(hierarchy, {}) +export const hierarchyToGraphV1 = (hierarchy: HierarchyPointNode) => _hierarchyToGraphV1(hierarchy, {}) export const containsSubgraphNode = (nodes: Node[], id: string): boolean => { for (const node of nodes) { From b3c18ec9e21c7d0b2310edda9002656dc9b5e002 Mon Sep 17 00:00:00 2001 From: Mikey Gower Date: Tue, 19 Sep 2023 13:14:42 -0400 Subject: [PATCH 09/22] fix entry file types on build --- src/layout/hierarchy/index.d.ts | 21 --------------------- 1 file changed, 21 deletions(-) delete mode 100644 src/layout/hierarchy/index.d.ts diff --git a/src/layout/hierarchy/index.d.ts b/src/layout/hierarchy/index.d.ts deleted file mode 100644 index ebffea1d..00000000 --- a/src/layout/hierarchy/index.d.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { HierarchyNode, HierarchyPointNode } from 'd3-hierarchy' -import type { Node, Edge, Placement } from '../../trellis' -import type { HierarchyData } from './utils' -import type { Extend } from '../../types' - -export type Options = Partial<{ - x: number - y: number - bfs: boolean - anchor: Placement - alignment: 'min' | 'mid' | 'max' - size: [number, number] - nodeSize: [number, number] - separation: (a: HierarchyPointNode>, b: HierarchyPointNode>) => number - sort: (a: HierarchyNode>, b: HierarchyNode>) => number -}> - -export function Layout(): ( - root: string, - graph: { nodes: N[]; edges: E[]; options?: Options } -) => { edges: E[]; nodes: Extend[] } From 4be05f4593ce1b23aa365292c32d14f7ec523d58 Mon Sep 17 00:00:00 2001 From: Mikey Gower Date: Tue, 19 Sep 2023 13:58:03 -0400 Subject: [PATCH 10/22] consider subgraph nodes when generating new hierarchy data --- src/layout/hierarchy/index.ts | 28 +++-------- src/layout/hierarchy/utils.ts | 89 +++++------------------------------ 2 files changed, 18 insertions(+), 99 deletions(-) diff --git a/src/layout/hierarchy/index.ts b/src/layout/hierarchy/index.ts index 84180f51..3503e2d0 100644 --- a/src/layout/hierarchy/index.ts +++ b/src/layout/hierarchy/index.ts @@ -1,6 +1,6 @@ import type { Node, Edge, Placement } from '../../trellis' -import { findAncestor, hierarchyToGraph, createGraphIndex, graphToHierarchy, HierarchyData } from './utils' -import { HierarchyNode, HierarchyPointNode, hierarchy } from 'd3-hierarchy' +import { hierarchyToGraph, createGraphIndex, graphToHierarchy, HierarchyData } from './utils' +import { HierarchyNode, HierarchyPointNode } from 'd3-hierarchy' import tree from './tree' export type Options = Partial<{ @@ -18,33 +18,17 @@ export type Options = Partial<{ const DEFAULT_NODE_SIZE: [number, number] = [120, 240] export const Layout = () => { - return (_root: string, graph: { nodes: N[]; edges: E[]; options?: Options }) => { + return (rootId: string, graph: { nodes: N[]; edges: E[]; options?: Options }) => { const index = createGraphIndex(graph) - const edgeIndex = graph.edges.reduce>((edgeIndex, edge) => { - if (edgeIndex[edge.source] === undefined) { - edgeIndex[edge.source] = [] - } - edgeIndex[edge.source].push(edge.target) - - if (edgeIndex[edge.target] === undefined) { - edgeIndex[edge.target] = [] - } - edgeIndex[edge.target].push(edge.source) - - return edgeIndex - }, {}) - - const rootId = edgeIndex[_root] === undefined ? findAncestor(graph.nodes, _root) ?? _root : _root - if (index[rootId] === undefined) { return { nodes: graph.nodes, edges: graph.edges } } - const root = hierarchy(graphToHierarchy(index, rootId, graph.options?.bfs)) + const hierarchy = graphToHierarchy(index, rootId, graph.options?.bfs) if (graph.options?.sort !== undefined) { - root.sort(graph.options.sort) + hierarchy.sort(graph.options.sort) } const layout = tree>() @@ -64,7 +48,7 @@ export const Layout = () => { layout.alignment(graph.options.alignment) } - const positionedDataById = hierarchyToGraph(layout(root)) + const positionedDataById = hierarchyToGraph(layout(hierarchy)) const { x = 0, y = 0 } = index[rootId].node const xOffset = (graph.options?.x ?? 0) + x diff --git a/src/layout/hierarchy/utils.ts b/src/layout/hierarchy/utils.ts index 287d7db6..0b5b78ec 100644 --- a/src/layout/hierarchy/utils.ts +++ b/src/layout/hierarchy/utils.ts @@ -1,5 +1,4 @@ -/* eslint-disable @typescript-eslint/no-unused-vars */ -import { HierarchyPointNode } from 'd3-hierarchy' +import { hierarchy, HierarchyPointNode } from 'd3-hierarchy' import type { Node, Edge } from '../../trellis' // types @@ -11,20 +10,20 @@ export type HierarchyData = ({ root: true; node: children: HierarchyData[] } -// v1 -export type HierarchyV1 = { id: string; children: HierarchyV1[] } - // utils -export const indexById = (items: T[]) => { - const lookup: Record = {} - for (const item of items) { - lookup[item.id] = item - } +export const createNodeIndex = (nodes: N[], lookup: Record = {}) => { + nodes.forEach((node) => { + lookup[node.id] = node + if (node.subgraph !== undefined) { + createNodeIndex(node.subgraph.nodes, lookup) + } + }) + return lookup } export const createGraphIndex = (graph: { nodes: N[]; edges: E[] }) => { - const nodes = indexById(graph.nodes) + const nodes = createNodeIndex(graph.nodes) return graph.edges.reduce>((index, edge) => { if (nodes[edge.source] !== undefined && nodes[edge.target] !== undefined) { @@ -83,12 +82,8 @@ export const graphToDFSHierarchy = ( return edge === null ? { root: true, node, edge, children } : { root: false, node, edge, children } } -export const graphToHierarchy = ( - index: GraphIndex, - rootId: string, - bfs = true -): HierarchyData => { - return bfs ? graphToBFSHierarchy(index, rootId) : graphToDFSHierarchy(index, index[rootId].node, null) +export const graphToHierarchy = (index: GraphIndex, rootId: string, bfs = true) => { + return hierarchy(bfs ? graphToBFSHierarchy(index, rootId) : graphToDFSHierarchy(index, index[rootId].node, null)) } export const hierarchyToGraph = ( @@ -106,66 +101,6 @@ export const hierarchyToGraph = ( return nodesById } -const _graphToDFSHierarchyV1 = (edgeIndex: Record, id: string, visited: Set): HierarchyV1 => { - visited.add(id) - - const children: HierarchyV1[] = [] - - for (const child of edgeIndex[id]) { - if (!visited.has(child)) { - children.push(_graphToDFSHierarchyV1(edgeIndex, child, visited)) - } - } - - return { id, children } -} - -export const graphToDFSHierarchyV1 = (edgeIndex: Record, id: string): HierarchyV1 => - _graphToDFSHierarchyV1(edgeIndex, id, new Set()) - -export const graphToBFSHierarchyV1 = (edgeIndex: Record, id: string): HierarchyV1 => { - const children: HierarchyV1['children'] = [] - - const queue: (readonly [string, HierarchyV1['children']])[] = [[id, children]] - - const visited = new Set([id]) - - while (queue.length > 0) { - const [id, children] = queue.shift()! - - for (const child of edgeIndex[id]) { - if (!visited.has(child)) { - visited.add(child) - const grandChildren: HierarchyV1['children'] = [] - children.push({ id: child, children: grandChildren }) - queue.push([child, grandChildren] as const) - } - } - } - - return { - id, - children - } -} - -const _hierarchyToGraphV1 = ( - hierarchy: HierarchyPointNode, - nodesById: Record | undefined> -) => { - nodesById[hierarchy.data.id] = hierarchy - - if (hierarchy.children !== undefined) { - for (const child of hierarchy.children) { - _hierarchyToGraphV1(child, nodesById) - } - } - - return nodesById -} - -export const hierarchyToGraphV1 = (hierarchy: HierarchyPointNode) => _hierarchyToGraphV1(hierarchy, {}) - export const containsSubgraphNode = (nodes: Node[], id: string): boolean => { for (const node of nodes) { if (node.id === id) return true From c9a71b8565daa89b4d9f9c36b8df356893b0cff0 Mon Sep 17 00:00:00 2001 From: Mikey Gower Date: Tue, 19 Sep 2023 14:41:08 -0400 Subject: [PATCH 11/22] initialize testing environment --- package-lock.json | 1875 +++++++++++++++++++++++++++++++- package.json | 21 +- tests/layout/hierarchy.test.ts | 35 + tests/lib/nodes.ts | 1002 +++++++++++++++++ tests/tsconfig.json | 10 + vitest.config.ts | 11 + 6 files changed, 2905 insertions(+), 49 deletions(-) create mode 100644 tests/layout/hierarchy.test.ts create mode 100644 tests/lib/nodes.ts create mode 100644 tests/tsconfig.json create mode 100644 vitest.config.ts diff --git a/package-lock.json b/package-lock.json index fc0fa37f..cb0794c2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -40,6 +40,7 @@ "eslint": "^8.49.0", "eslint-config-prettier": "^9.0.0", "eslint-plugin-prettier": "^5.0.0", + "happy-dom": "^12.1.2", "parcel": "^2.9.3", "prettier": "^3.0.3", "process": "^0.11.10", @@ -51,7 +52,9 @@ "rxjs": "^6.5.5", "stats.js": "^0.17.0", "ts-loader": "^6.2.2", - "typescript": "^5.2.2" + "typescript": "^5.2.2", + "vite": "^4.4.9", + "vitest": "^0.34.4" }, "peerDependencies": { "react": ">=16.0" @@ -86,6 +89,358 @@ "js-tokens": "^4.0.0" } }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -175,6 +530,24 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, "node_modules/@lezer/common": { "version": "0.15.12", "resolved": "https://registry.npmjs.org/@lezer/common/-/common-0.15.12.tgz", @@ -2948,6 +3321,12 @@ "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", "dev": true }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, "node_modules/@swc/core": { "version": "1.3.83", "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.83.tgz", @@ -3221,6 +3600,21 @@ "@turf/helpers": "^6.3.0" } }, + "node_modules/@types/chai": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.6.tgz", + "integrity": "sha512-VOVRLM1mBxIRxydiViqPcKn6MIxZytrbMpd6RJLIWKxUNr3zux8no0Oc7kJx0WAPIitgZ0gkrDS+btlqQpubpw==", + "dev": true + }, + "node_modules/@types/chai-subset": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz", + "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==", + "dev": true, + "dependencies": { + "@types/chai": "*" + } + }, "node_modules/@types/d3-color": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.0.tgz", @@ -3286,6 +3680,12 @@ "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", "dev": true }, + "node_modules/@types/node": { + "version": "20.6.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.2.tgz", + "integrity": "sha512-Y+/1vGBHV/cYk6OI1Na/LHzwnlNCAfU3ZNGrc1LdRe/LAIbdDPTTv/HU3M7yXN448aTVDq3eKRm2cg7iKLb8gw==", + "dev": true + }, "node_modules/@types/offscreencanvas": { "version": "2019.6.4", "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.6.4.tgz", @@ -3571,6 +3971,101 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@vitest/expect": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.34.4.tgz", + "integrity": "sha512-XlMKX8HyYUqB8dsY8Xxrc64J2Qs9pKMt2Z8vFTL4mBWXJsg4yoALHzJfDWi8h5nkO4Zua4zjqtapQ/IluVkSnA==", + "dev": true, + "dependencies": { + "@vitest/spy": "0.34.4", + "@vitest/utils": "0.34.4", + "chai": "^4.3.7" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.34.4.tgz", + "integrity": "sha512-hwwdB1StERqUls8oV8YcpmTIpVeJMe4WgYuDongVzixl5hlYLT2G8afhcdADeDeqCaAmZcSgLTLtqkjPQF7x+w==", + "dev": true, + "dependencies": { + "@vitest/utils": "0.34.4", + "p-limit": "^4.0.0", + "pathe": "^1.1.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/runner/node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/snapshot": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-0.34.4.tgz", + "integrity": "sha512-GCsh4coc3YUSL/o+BPUo7lHQbzpdttTxL6f4q0jRx2qVGoYz/cyTRDJHbnwks6TILi6560bVWoBpYC10PuTLHw==", + "dev": true, + "dependencies": { + "magic-string": "^0.30.1", + "pathe": "^1.1.1", + "pretty-format": "^29.5.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.34.4.tgz", + "integrity": "sha512-PNU+fd7DUPgA3Ya924b1qKuQkonAW6hL7YUjkON3wmBwSTIlhOSpy04SJ0NrRsEbrXgMMj6Morh04BMf8k+w0g==", + "dev": true, + "dependencies": { + "tinyspy": "^2.1.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.34.4.tgz", + "integrity": "sha512-yR2+5CHhp/K4ySY0Qtd+CAL9f5Yh1aXrKfAT42bq6CtlGPh92jIDDDSg7ydlRow1CP+dys4TrOrbELOyNInHSg==", + "dev": true, + "dependencies": { + "diff-sequences": "^29.4.3", + "loupe": "^2.3.6", + "pretty-format": "^29.5.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, "node_modules/abortcontroller-polyfill": { "version": "1.7.5", "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz", @@ -3598,6 +4093,15 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -3650,6 +4154,15 @@ "node": ">=8" } }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -3770,6 +4283,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -3799,6 +4321,24 @@ } ] }, + "node_modules/chai": { + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.8.tgz", + "integrity": "sha512-vX4YvVVtxlfSZ2VecZgFUTU5qPCYsobVI2O9FmwEXBhDigYGQA6jRXCycIs1yJnnWbZ6/+a2zNIF5DfVCcJBFQ==", + "dev": true, + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^4.1.2", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -3813,6 +4353,15 @@ "node": ">=4" } }, + "node_modules/check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/chrome-trace-event": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", @@ -3989,6 +4538,12 @@ "url": "https://github.com/sponsors/fb55" } }, + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "dev": true + }, "node_modules/csso": { "version": "5.0.5", "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", @@ -4192,6 +4747,18 @@ } } }, + "node_modules/deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "dev": true, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -4256,6 +4823,15 @@ "node": ">=0.10" } }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -4426,6 +5002,43 @@ "is-arrayish": "^0.2.1" } }, + "node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -4862,6 +5475,29 @@ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/get-port": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/get-port/-/get-port-4.2.0.tgz", @@ -4974,6 +5610,32 @@ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, + "node_modules/happy-dom": { + "version": "12.1.2", + "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-12.1.2.tgz", + "integrity": "sha512-Ee0MdMXAMzfmZ4gLe33iKt8Rza5Fkyr+DxtHzCiBihTkI8JoX2XOfPdSsKDr0JAoMNYdMrFqIDYBoHq5DJqDXg==", + "dev": true, + "dependencies": { + "css.escape": "^1.5.1", + "entities": "^4.5.0", + "iconv-lite": "^0.6.3", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0" + } + }, + "node_modules/happy-dom/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -5084,6 +5746,18 @@ "node": ">=14.18.0" } }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ignore": { "version": "5.2.4", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", @@ -5320,6 +5994,12 @@ "json5": "lib/cli.js" } }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, "node_modules/keyv": { "version": "4.5.3", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", @@ -5609,6 +6289,18 @@ "node": ">=4.0.0" } }, + "node_modules/local-pkg": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", + "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -5648,6 +6340,15 @@ "loose-envify": "cli.js" } }, + "node_modules/loupe": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.0" + } + }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -5660,6 +6361,18 @@ "node": ">=10" } }, + "node_modules/magic-string": { + "version": "0.30.3", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.3.tgz", + "integrity": "sha512-B7xGbll2fG/VjP+SWg4sX3JynwIU0mjoTc6MPpKNuIvftk6u6vqhDnk1R80b8C2GBR6ywqy+1DcKBrevBg+bmw==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/mdn-data": { "version": "2.0.30", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", @@ -5739,6 +6452,18 @@ "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, + "node_modules/mlly": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.4.2.tgz", + "integrity": "sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==", + "dev": true, + "dependencies": { + "acorn": "^8.10.0", + "pathe": "^1.1.1", + "pkg-types": "^1.0.3", + "ufo": "^1.3.0" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -5788,6 +6513,24 @@ "node-gyp-build-optional-packages-test": "build-test.js" } }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -6133,6 +6876,21 @@ "node": ">=8" } }, + "node_modules/pathe": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz", + "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==", + "dev": true + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -6220,6 +6978,45 @@ "url": "https://opencollective.com/pixijs" } }, + "node_modules/pkg-types": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", + "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", + "dev": true, + "dependencies": { + "jsonc-parser": "^3.2.0", + "mlly": "^1.2.0", + "pathe": "^1.1.0" + } + }, + "node_modules/postcss": { + "version": "8.4.30", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.30.tgz", + "integrity": "sha512-7ZEao1g4kd68l97aWG/etQKPKq07us0ieSZ2TnFDk11i0ZfDW2AwKHYU8qv4MZKqN2fdBfg+7q0ES06UA73C1g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, "node_modules/postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", @@ -6311,6 +7108,38 @@ "node": ">=6.0.0" } }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/pretty-format/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, "node_modules/process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -6517,6 +7346,22 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rollup": { + "version": "3.29.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.2.tgz", + "integrity": "sha512-CJouHoZ27v6siztc21eEQGo0kIcE5D1gVPA571ez0mMYb25LGYGKnVNXpEj5MGlepmDWGXNjDB5q7uNiPHC11A==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, "node_modules/run-applescript": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", @@ -6662,6 +7507,12 @@ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, "node_modules/scheduler": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", @@ -6702,6 +7553,12 @@ "node": ">=8" } }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true + }, "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", @@ -6737,8 +7594,6 @@ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", "dev": true, - "optional": true, - "peer": true, "engines": { "node": ">=0.10.0" } @@ -6762,12 +7617,24 @@ "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", "dev": true }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true + }, "node_modules/stats.js": { "version": "0.17.0", "resolved": "https://registry.npmjs.org/stats.js/-/stats.js-0.17.0.tgz", "integrity": "sha1-scPcRtlEmLV4t/05hbgaznExzH0=", "dev": true }, + "node_modules/std-env": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.4.3.tgz", + "integrity": "sha512-f9aPhy8fYBuMN+sNfakZV18U39PbalgjXG3lLB9WkaYTxijru61wb57V9wxxNthXM5Sd88ETBWi29qLAsHO52Q==", + "dev": true + }, "node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -6813,6 +7680,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strip-literal": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.3.0.tgz", + "integrity": "sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==", + "dev": true, + "dependencies": { + "acorn": "^8.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -6906,6 +7785,30 @@ "integrity": "sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==", "dev": true }, + "node_modules/tinybench": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.5.1.tgz", + "integrity": "sha512-65NKvSuAVDP/n4CqH+a9w2kTlLReS9vhsAP06MWx+/89nMinJyB2icyl58RIcqCmIggpojIGeuJGhjU1aGMBSg==", + "dev": true + }, + "node_modules/tinypool": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.7.0.tgz", + "integrity": "sha512-zSYNUlYSMhJ6Zdou4cJwo/p7w5nmAH17GRfU/ui3ctvjXFErXXkruT4MWW6poDeXgCaIBlGLrfU6TbTXxyGMww==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.1.1.tgz", + "integrity": "sha512-XPJL2uSzcOyBMky6OFrusqWlzfFrXtE0hPuMgW8A2HmaqrPo4ZQHRN/V0QXN3FSjKxpsbRrFc5LI7KOwBsT1/w==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/titleize": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", @@ -6976,6 +7879,15 @@ "node": ">= 0.8.0" } }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/typescript": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", @@ -6989,6 +7901,12 @@ "node": ">=14.17" } }, + "node_modules/ufo": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.3.0.tgz", + "integrity": "sha512-bRn3CsoojyNStCZe0BG0Mt4Nr/4KF+rhFlnNXybgqt5pXHNFRlqinSoQaTrGyzE4X8aHplSb+TorH+COin9Yxw==", + "dev": true + }, "node_modules/untildify": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", @@ -7075,12 +7993,197 @@ "node": ">= 4" } }, + "node_modules/vite": { + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.9.tgz", + "integrity": "sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==", + "dev": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.34.4.tgz", + "integrity": "sha512-ho8HtiLc+nsmbwZMw8SlghESEE3KxJNp04F/jPUCLVvaURwt0d+r9LxEqCX5hvrrOQ0GSyxbYr5ZfRYhQ0yVKQ==", + "dev": true, + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "mlly": "^1.4.0", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "vite": "^3.0.0 || ^4.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": ">=v14.18.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vitest": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.34.4.tgz", + "integrity": "sha512-SE/laOsB6995QlbSE6BtkpXDeVNLJc1u2LHRG/OpnN4RsRzM3GQm4nm3PQCK5OBtrsUqnhzLdnT7se3aeNGdlw==", + "dev": true, + "dependencies": { + "@types/chai": "^4.3.5", + "@types/chai-subset": "^1.3.3", + "@types/node": "*", + "@vitest/expect": "0.34.4", + "@vitest/runner": "0.34.4", + "@vitest/snapshot": "0.34.4", + "@vitest/spy": "0.34.4", + "@vitest/utils": "0.34.4", + "acorn": "^8.9.0", + "acorn-walk": "^8.2.0", + "cac": "^6.7.14", + "chai": "^4.3.7", + "debug": "^4.3.4", + "local-pkg": "^0.4.3", + "magic-string": "^0.30.1", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "std-env": "^3.3.3", + "strip-literal": "^1.0.1", + "tinybench": "^2.5.0", + "tinypool": "^0.7.0", + "vite": "^3.1.0 || ^4.0.0 || ^5.0.0-0", + "vite-node": "0.34.4", + "why-is-node-running": "^2.2.2" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": ">=v14.18.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@vitest/browser": "*", + "@vitest/ui": "*", + "happy-dom": "*", + "jsdom": "*", + "playwright": "*", + "safaridriver": "*", + "webdriverio": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "playwright": { + "optional": true + }, + "safaridriver": { + "optional": true + }, + "webdriverio": { + "optional": true + } + } + }, "node_modules/weak-lru-cache": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==", "dev": true }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "dev": true, + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -7096,6 +8199,22 @@ "node": ">= 8" } }, + "node_modules/why-is-node-running": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", + "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", + "dev": true, + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -7108,51 +8227,205 @@ "integrity": "sha512-/eyHVRJQCirEkSZ1agRSCwriMhwlyUcFkXD5TPVSLP+IPzjsqMVzZwdoczLp1SoQU0R3dxz1RpIK+4YNQbCVOA==", "dev": true }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + }, + "dependencies": { + "@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true + }, + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "dev": true, + "optional": true }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - }, - "dependencies": { - "@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true + "optional": true }, - "@babel/code-frame": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", - "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", "dev": true, - "requires": { - "@babel/highlight": "^7.0.0" - } + "optional": true }, - "@babel/highlight": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", - "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "dev": true, + "optional": true }, "@eslint-community/eslint-utils": { "version": "4.4.0", @@ -7215,6 +8488,21 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "requires": { + "@sinclair/typebox": "^0.27.8" + } + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, "@lezer/common": { "version": "0.15.12", "resolved": "https://registry.npmjs.org/@lezer/common/-/common-0.15.12.tgz", @@ -8927,6 +10215,12 @@ } } }, + "@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, "@swc/core": { "version": "1.3.83", "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.83.tgz", @@ -9091,6 +10385,21 @@ "@turf/helpers": "^6.3.0" } }, + "@types/chai": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.6.tgz", + "integrity": "sha512-VOVRLM1mBxIRxydiViqPcKn6MIxZytrbMpd6RJLIWKxUNr3zux8no0Oc7kJx0WAPIitgZ0gkrDS+btlqQpubpw==", + "dev": true + }, + "@types/chai-subset": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz", + "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==", + "dev": true, + "requires": { + "@types/chai": "*" + } + }, "@types/d3-color": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.0.tgz", @@ -9156,6 +10465,12 @@ "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", "dev": true }, + "@types/node": { + "version": "20.6.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.2.tgz", + "integrity": "sha512-Y+/1vGBHV/cYk6OI1Na/LHzwnlNCAfU3ZNGrc1LdRe/LAIbdDPTTv/HU3M7yXN448aTVDq3eKRm2cg7iKLb8gw==", + "dev": true + }, "@types/offscreencanvas": { "version": "2019.6.4", "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.6.4.tgz", @@ -9340,6 +10655,76 @@ "eslint-visitor-keys": "^3.4.1" } }, + "@vitest/expect": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.34.4.tgz", + "integrity": "sha512-XlMKX8HyYUqB8dsY8Xxrc64J2Qs9pKMt2Z8vFTL4mBWXJsg4yoALHzJfDWi8h5nkO4Zua4zjqtapQ/IluVkSnA==", + "dev": true, + "requires": { + "@vitest/spy": "0.34.4", + "@vitest/utils": "0.34.4", + "chai": "^4.3.7" + } + }, + "@vitest/runner": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.34.4.tgz", + "integrity": "sha512-hwwdB1StERqUls8oV8YcpmTIpVeJMe4WgYuDongVzixl5hlYLT2G8afhcdADeDeqCaAmZcSgLTLtqkjPQF7x+w==", + "dev": true, + "requires": { + "@vitest/utils": "0.34.4", + "p-limit": "^4.0.0", + "pathe": "^1.1.1" + }, + "dependencies": { + "p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "requires": { + "yocto-queue": "^1.0.0" + } + }, + "yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true + } + } + }, + "@vitest/snapshot": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-0.34.4.tgz", + "integrity": "sha512-GCsh4coc3YUSL/o+BPUo7lHQbzpdttTxL6f4q0jRx2qVGoYz/cyTRDJHbnwks6TILi6560bVWoBpYC10PuTLHw==", + "dev": true, + "requires": { + "magic-string": "^0.30.1", + "pathe": "^1.1.1", + "pretty-format": "^29.5.0" + } + }, + "@vitest/spy": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.34.4.tgz", + "integrity": "sha512-PNU+fd7DUPgA3Ya924b1qKuQkonAW6hL7YUjkON3wmBwSTIlhOSpy04SJ0NrRsEbrXgMMj6Morh04BMf8k+w0g==", + "dev": true, + "requires": { + "tinyspy": "^2.1.1" + } + }, + "@vitest/utils": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.34.4.tgz", + "integrity": "sha512-yR2+5CHhp/K4ySY0Qtd+CAL9f5Yh1aXrKfAT42bq6CtlGPh92jIDDDSg7ydlRow1CP+dys4TrOrbELOyNInHSg==", + "dev": true, + "requires": { + "diff-sequences": "^29.4.3", + "loupe": "^2.3.6", + "pretty-format": "^29.5.0" + } + }, "abortcontroller-polyfill": { "version": "1.7.5", "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz", @@ -9359,6 +10744,12 @@ "dev": true, "requires": {} }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true + }, "ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -9398,6 +10789,12 @@ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true + }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -9480,6 +10877,12 @@ "run-applescript": "^5.0.0" } }, + "cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true + }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -9492,6 +10895,21 @@ "integrity": "sha512-n2pUQYGAkrLG4QYj2desAh+NqsJpHbNmVZz87imptDdxLAtjxary7Df/psdfyDGmskJK/9Dt9cPnx5RZ3CU4Og==", "dev": true }, + "chai": { + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.8.tgz", + "integrity": "sha512-vX4YvVVtxlfSZ2VecZgFUTU5qPCYsobVI2O9FmwEXBhDigYGQA6jRXCycIs1yJnnWbZ6/+a2zNIF5DfVCcJBFQ==", + "dev": true, + "requires": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^4.1.2", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + } + }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -9503,6 +10921,12 @@ "supports-color": "^5.3.0" } }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "dev": true + }, "chrome-trace-event": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", @@ -9639,6 +11063,12 @@ "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "dev": true }, + "css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "dev": true + }, "csso": { "version": "5.0.5", "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", @@ -9811,6 +11241,15 @@ "ms": "2.1.2" } }, + "deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "dev": true, + "requires": { + "type-detect": "^4.0.0" + } + }, "deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -9851,6 +11290,12 @@ "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", "dev": true }, + "diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true + }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -9978,6 +11423,36 @@ "is-arrayish": "^0.2.1" } }, + "esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "requires": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -10301,6 +11776,19 @@ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, + "fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "optional": true + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "dev": true + }, "get-port": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/get-port/-/get-port-4.2.0.tgz", @@ -10379,6 +11867,28 @@ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, + "happy-dom": { + "version": "12.1.2", + "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-12.1.2.tgz", + "integrity": "sha512-Ee0MdMXAMzfmZ4gLe33iKt8Rza5Fkyr+DxtHzCiBihTkI8JoX2XOfPdSsKDr0JAoMNYdMrFqIDYBoHq5DJqDXg==", + "dev": true, + "requires": { + "css.escape": "^1.5.1", + "entities": "^4.5.0", + "iconv-lite": "^0.6.3", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0" + }, + "dependencies": { + "entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true + } + } + }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -10428,6 +11938,15 @@ "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", "dev": true }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, "ignore": { "version": "5.2.4", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", @@ -10603,6 +12122,12 @@ "minimist": "^1.2.0" } }, + "jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, "keyv": { "version": "4.5.3", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", @@ -10756,6 +12281,12 @@ "json5": "^1.0.1" } }, + "local-pkg": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", + "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", + "dev": true + }, "locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -10786,6 +12317,15 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, + "loupe": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "dev": true, + "requires": { + "get-func-name": "^2.0.0" + } + }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -10795,6 +12335,15 @@ "yallist": "^4.0.0" } }, + "magic-string": { + "version": "0.30.3", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.3.tgz", + "integrity": "sha512-B7xGbll2fG/VjP+SWg4sX3JynwIU0mjoTc6MPpKNuIvftk6u6vqhDnk1R80b8C2GBR6ywqy+1DcKBrevBg+bmw==", + "dev": true, + "requires": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, "mdn-data": { "version": "2.0.30", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", @@ -10856,6 +12405,18 @@ "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, + "mlly": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.4.2.tgz", + "integrity": "sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==", + "dev": true, + "requires": { + "acorn": "^8.10.0", + "pathe": "^1.1.1", + "pkg-types": "^1.0.3", + "ufo": "^1.3.0" + } + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -10896,6 +12457,12 @@ } } }, + "nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true + }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -11143,6 +12710,18 @@ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true }, + "pathe": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz", + "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==", + "dev": true + }, + "pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true + }, "picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -11218,6 +12797,28 @@ } } }, + "pkg-types": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", + "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", + "dev": true, + "requires": { + "jsonc-parser": "^3.2.0", + "mlly": "^1.2.0", + "pathe": "^1.1.0" + } + }, + "postcss": { + "version": "8.4.30", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.30.tgz", + "integrity": "sha512-7ZEao1g4kd68l97aWG/etQKPKq07us0ieSZ2TnFDk11i0ZfDW2AwKHYU8qv4MZKqN2fdBfg+7q0ES06UA73C1g==", + "dev": true, + "requires": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, "postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", @@ -11284,6 +12885,31 @@ "fast-diff": "^1.1.2" } }, + "pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "requires": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + }, + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + } + } + }, "process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -11448,6 +13074,15 @@ "glob": "^7.1.3" } }, + "rollup": { + "version": "3.29.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.2.tgz", + "integrity": "sha512-CJouHoZ27v6siztc21eEQGo0kIcE5D1gVPA571ez0mMYb25LGYGKnVNXpEj5MGlepmDWGXNjDB5q7uNiPHC11A==", + "dev": true, + "requires": { + "fsevents": "~2.3.2" + } + }, "run-applescript": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", @@ -11542,6 +13177,12 @@ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, "scheduler": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", @@ -11573,6 +13214,12 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, + "siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true + }, "signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", @@ -11601,9 +13248,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true, - "optional": true, - "peer": true + "dev": true }, "srcset": { "version": "4.0.0", @@ -11617,12 +13262,24 @@ "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", "dev": true }, + "stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true + }, "stats.js": { "version": "0.17.0", "resolved": "https://registry.npmjs.org/stats.js/-/stats.js-0.17.0.tgz", "integrity": "sha1-scPcRtlEmLV4t/05hbgaznExzH0=", "dev": true }, + "std-env": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.4.3.tgz", + "integrity": "sha512-f9aPhy8fYBuMN+sNfakZV18U39PbalgjXG3lLB9WkaYTxijru61wb57V9wxxNthXM5Sd88ETBWi29qLAsHO52Q==", + "dev": true + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -11653,6 +13310,15 @@ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true }, + "strip-literal": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.3.0.tgz", + "integrity": "sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==", + "dev": true, + "requires": { + "acorn": "^8.10.0" + } + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -11720,6 +13386,24 @@ "integrity": "sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==", "dev": true }, + "tinybench": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.5.1.tgz", + "integrity": "sha512-65NKvSuAVDP/n4CqH+a9w2kTlLReS9vhsAP06MWx+/89nMinJyB2icyl58RIcqCmIggpojIGeuJGhjU1aGMBSg==", + "dev": true + }, + "tinypool": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.7.0.tgz", + "integrity": "sha512-zSYNUlYSMhJ6Zdou4cJwo/p7w5nmAH17GRfU/ui3ctvjXFErXXkruT4MWW6poDeXgCaIBlGLrfU6TbTXxyGMww==", + "dev": true + }, + "tinyspy": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.1.1.tgz", + "integrity": "sha512-XPJL2uSzcOyBMky6OFrusqWlzfFrXtE0hPuMgW8A2HmaqrPo4ZQHRN/V0QXN3FSjKxpsbRrFc5LI7KOwBsT1/w==", + "dev": true + }, "titleize": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", @@ -11770,12 +13454,24 @@ "prelude-ls": "^1.2.1" } }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, "typescript": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", "dev": true }, + "ufo": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.3.0.tgz", + "integrity": "sha512-bRn3CsoojyNStCZe0BG0Mt4Nr/4KF+rhFlnNXybgqt5pXHNFRlqinSoQaTrGyzE4X8aHplSb+TorH+COin9Yxw==", + "dev": true + }, "untildify": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", @@ -11837,12 +13533,91 @@ "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==", "dev": true }, + "vite": { + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.9.tgz", + "integrity": "sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==", + "dev": true, + "requires": { + "esbuild": "^0.18.10", + "fsevents": "~2.3.2", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + } + }, + "vite-node": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.34.4.tgz", + "integrity": "sha512-ho8HtiLc+nsmbwZMw8SlghESEE3KxJNp04F/jPUCLVvaURwt0d+r9LxEqCX5hvrrOQ0GSyxbYr5ZfRYhQ0yVKQ==", + "dev": true, + "requires": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "mlly": "^1.4.0", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "vite": "^3.0.0 || ^4.0.0" + } + }, + "vitest": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.34.4.tgz", + "integrity": "sha512-SE/laOsB6995QlbSE6BtkpXDeVNLJc1u2LHRG/OpnN4RsRzM3GQm4nm3PQCK5OBtrsUqnhzLdnT7se3aeNGdlw==", + "dev": true, + "requires": { + "@types/chai": "^4.3.5", + "@types/chai-subset": "^1.3.3", + "@types/node": "*", + "@vitest/expect": "0.34.4", + "@vitest/runner": "0.34.4", + "@vitest/snapshot": "0.34.4", + "@vitest/spy": "0.34.4", + "@vitest/utils": "0.34.4", + "acorn": "^8.9.0", + "acorn-walk": "^8.2.0", + "cac": "^6.7.14", + "chai": "^4.3.7", + "debug": "^4.3.4", + "local-pkg": "^0.4.3", + "magic-string": "^0.30.1", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "std-env": "^3.3.3", + "strip-literal": "^1.0.1", + "tinybench": "^2.5.0", + "tinypool": "^0.7.0", + "vite": "^3.1.0 || ^4.0.0 || ^5.0.0-0", + "vite-node": "0.34.4", + "why-is-node-running": "^2.2.2" + } + }, "weak-lru-cache": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==", "dev": true }, + "webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true + }, + "whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "dev": true, + "requires": { + "iconv-lite": "0.6.3" + } + }, + "whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "dev": true + }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -11852,6 +13627,16 @@ "isexe": "^2.0.0" } }, + "why-is-node-running": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", + "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", + "dev": true, + "requires": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", diff --git a/package.json b/package.json index 22d82570..cf6e4e04 100644 --- a/package.json +++ b/package.json @@ -6,11 +6,14 @@ "main": "./dist/main.js", "module": "./dist/module.js", "types": "./dist/index.d.ts", - "files": ["dist"], + "files": [ + "dist" + ], "scripts": { "clean": "rm -rf dist && rm -rf .parcel-cache", "format": "prettier . --write", - "test": "echo \"Error: no test specified\" && exit 1", + "test": "vitest run", + "test:watch": "vitest --reporter verbose", "typecheck": "tsc --noEmit", "lint": "eslint \"src/**/*.ts\"", "lint:fix": "eslint \"src/**/**.{ts,tsx}\" --fix", @@ -55,6 +58,7 @@ "eslint": "^8.49.0", "eslint-config-prettier": "^9.0.0", "eslint-plugin-prettier": "^5.0.0", + "happy-dom": "^12.1.2", "parcel": "^2.9.3", "prettier": "^3.0.3", "process": "^0.11.10", @@ -66,9 +70,18 @@ "rxjs": "^6.5.5", "stats.js": "^0.17.0", "ts-loader": "^6.2.2", - "typescript": "^5.2.2" + "typescript": "^5.2.2", + "vite": "^4.4.9", + "vitest": "^0.34.4" }, - "keywords": ["graph", "network", "infovis", "visualization", "react", "webgl"], + "keywords": [ + "graph", + "network", + "infovis", + "visualization", + "react", + "webgl" + ], "peerDependencies": { "react": ">=16.0" }, diff --git a/tests/layout/hierarchy.test.ts b/tests/layout/hierarchy.test.ts new file mode 100644 index 00000000..348a0527 --- /dev/null +++ b/tests/layout/hierarchy.test.ts @@ -0,0 +1,35 @@ +import { createNodeIndex } from '../../src/layout/hierarchy/utils' +import { Node } from '../../src/trellis' +import data from '../lib/nodes' + +describe('[Layout - Hierarchy]', () => { + const nodes: Node[] = data.slice(0, 10).map((node) => { + const start = node.id * 100 + return { + ...node, + id: String(node.id), + subgraph: { + edges: [], + nodes: data.slice(start, start + 10).map((n) => ({ ...n, id: String(n.id) })) + } + } + }) + + const lookup = createNodeIndex(nodes) + + describe('createNodeIndex', () => { + it('should create a lookup table of nodes', () => { + const ids = nodes.map((node) => String(node.id)) + ids.forEach((id) => { + expect(lookup).toHaveProperty(id) + }) + }) + + it('should index subgraph nodes', () => { + expect(lookup).toHaveProperty('101') + expect(lookup).toHaveProperty('201') + expect(lookup).toHaveProperty('301') + expect(lookup).toHaveProperty('401') + }) + }) +}) diff --git a/tests/lib/nodes.ts b/tests/lib/nodes.ts new file mode 100644 index 00000000..1e1467be --- /dev/null +++ b/tests/lib/nodes.ts @@ -0,0 +1,1002 @@ +export default [ + { id: 1, label: 'Pedro Steddall', radius: 18, x: -853, y: -157 }, + { id: 2, label: 'Wolfy Ahrend', radius: 18, x: -563, y: -299 }, + { id: 3, label: 'Coral Najafian', radius: 18, x: 570, y: 349 }, + { id: 4, label: 'Marguerite Girardetti', radius: 18, x: 567, y: -316 }, + { id: 5, label: 'Ofilia Hiseman', radius: 18, x: 45, y: 404 }, + { id: 6, label: 'Mirella Collman', radius: 18, x: 405, y: 806 }, + { id: 7, label: 'Kimble Lount', radius: 18, x: 32, y: -569 }, + { id: 8, label: 'Bernette Castellone', radius: 18, x: -931, y: 170 }, + { id: 9, label: 'Harcourt Morhall', radius: 18, x: -721, y: 232 }, + { id: 10, label: 'Tait Romei', radius: 18, x: -610, y: 702 }, + { id: 11, label: 'Rudolfo Human', radius: 18, x: -645, y: -38 }, + { id: 12, label: 'Itch Morrish', radius: 18, x: -813, y: -758 }, + { id: 13, label: 'Denni Anster', radius: 18, x: -437, y: -680 }, + { id: 14, label: 'Jameson Heimes', radius: 18, x: -159, y: 959 }, + { id: 15, label: 'Valentine Upfold', radius: 18, x: 716, y: -473 }, + { id: 16, label: 'Correy McAne', radius: 18, x: 557, y: -970 }, + { id: 17, label: 'Beryle Armatidge', radius: 18, x: 530, y: 214 }, + { id: 18, label: 'Thorndike Carlozzi', radius: 18, x: -662, y: -853 }, + { id: 19, label: 'Yuma Blakeston', radius: 18, x: 959, y: 888 }, + { id: 20, label: 'Goldi Birtwistle', radius: 18, x: -197, y: 485 }, + { id: 21, label: 'Pammy Elie', radius: 18, x: -664, y: 857 }, + { id: 22, label: 'Rodi Skeemor', radius: 18, x: 386, y: 111 }, + { id: 23, label: 'Linnet Pierson', radius: 18, x: 948, y: 880 }, + { id: 24, label: 'Ulberto Coldham', radius: 18, x: 876, y: 464 }, + { id: 25, label: 'Temple Merryman', radius: 18, x: -177, y: 594 }, + { id: 26, label: 'Cherri Siviter', radius: 18, x: 386, y: 656 }, + { id: 27, label: 'Bettye Jeffers', radius: 18, x: 819, y: -605 }, + { id: 28, label: 'Tresa Wasielewicz', radius: 18, x: -464, y: -722 }, + { id: 29, label: 'Nadia Husband', radius: 18, x: 829, y: 707 }, + { id: 30, label: 'Pall Worlock', radius: 18, x: -398, y: -730 }, + { id: 31, label: 'Fonz Minchenton', radius: 18, x: 746, y: -578 }, + { id: 32, label: 'Arv Milbank', radius: 18, x: -420, y: 524 }, + { id: 33, label: 'Dugald Brotherhead', radius: 18, x: -407, y: -70 }, + { id: 34, label: 'Marlene Kinze', radius: 18, x: 903, y: -174 }, + { id: 35, label: 'Quinn Bosden', radius: 18, x: 250, y: -620 }, + { id: 36, label: 'Kate Patullo', radius: 18, x: -615, y: -601 }, + { id: 37, label: 'Maggi Streeton', radius: 18, x: -956, y: -652 }, + { id: 38, label: 'Rasla Ghidoli', radius: 18, x: 55, y: -450 }, + { id: 39, label: 'Lydie Harefoot', radius: 18, x: -473, y: 650 }, + { id: 40, label: 'Maureen Van Vuuren', radius: 18, x: -519, y: 294 }, + { id: 41, label: 'Mariska Klimashevich', radius: 18, x: 984, y: -621 }, + { id: 42, label: 'Dexter Toller', radius: 18, x: -828, y: 328 }, + { id: 43, label: 'Townie Scurrah', radius: 18, x: -342, y: -677 }, + { id: 44, label: 'Palm Kenninghan', radius: 18, x: -558, y: -597 }, + { id: 45, label: 'Adelheid Walklott', radius: 18, x: 102, y: 848 }, + { id: 46, label: 'Hort Addington', radius: 18, x: 719, y: -958 }, + { id: 47, label: 'Gerick Beagrie', radius: 18, x: -618, y: 885 }, + { id: 48, label: 'Wald Diehn', radius: 18, x: -289, y: -15 }, + { id: 49, label: 'Barbra Crayton', radius: 18, x: 131, y: 172 }, + { id: 50, label: 'Dwayne Heliet', radius: 18, x: 366, y: 411 }, + { id: 51, label: 'Trescha Dudbridge', radius: 18, x: 58, y: 969 }, + { id: 52, label: 'Guthry Rafferty', radius: 18, x: 200, y: -544 }, + { id: 53, label: 'Rheta Shepheard', radius: 18, x: -826, y: 797 }, + { id: 54, label: 'Colas Divell', radius: 18, x: -957, y: 966 }, + { id: 55, label: 'Lisha Gate', radius: 18, x: 340, y: 486 }, + { id: 56, label: 'Kirk Peare', radius: 18, x: -163, y: 461 }, + { id: 57, label: 'Pooh Bittlestone', radius: 18, x: 230, y: -616 }, + { id: 58, label: 'Sonia Nutbrown', radius: 18, x: 772, y: -616 }, + { id: 59, label: 'Corinna Fussey', radius: 18, x: 182, y: -16 }, + { id: 60, label: 'Peggi Lait', radius: 18, x: 3, y: -981 }, + { id: 61, label: 'Marlyn Prendeville', radius: 18, x: 663, y: 822 }, + { id: 62, label: 'Brynne Karlolak', radius: 18, x: -434, y: -22 }, + { id: 63, label: 'Urson Oxby', radius: 18, x: 127, y: 191 }, + { id: 64, label: 'Fanya Paylor', radius: 18, x: -848, y: 979 }, + { id: 65, label: 'Stanley Bassil', radius: 18, x: -515, y: 506 }, + { id: 66, label: 'Oralle Burdus', radius: 18, x: 108, y: -487 }, + { id: 67, label: 'Tamra Brayshay', radius: 18, x: -161, y: -683 }, + { id: 68, label: 'Valentina Santos', radius: 18, x: -325, y: 131 }, + { id: 69, label: 'Mala Gut', radius: 18, x: 322, y: -610 }, + { id: 70, label: 'Vida Maybey', radius: 18, x: -989, y: 77 }, + { id: 71, label: 'Damaris Maddrell', radius: 18, x: -494, y: -396 }, + { id: 72, label: 'Courtenay Keune', radius: 18, x: 864, y: -971 }, + { id: 73, label: 'Joana Hathorn', radius: 18, x: 609, y: 871 }, + { id: 74, label: 'Harrison Bridgen', radius: 18, x: -988, y: 83 }, + { id: 75, label: 'Raychel Deesly', radius: 18, x: 149, y: 729 }, + { id: 76, label: 'June Yegorov', radius: 18, x: -255, y: 187 }, + { id: 77, label: 'Ruperta Cornelisse', radius: 18, x: 783, y: 323 }, + { id: 78, label: "Celesta O'Moylan", radius: 18, x: -223, y: 43 }, + { id: 79, label: 'Leona Kinnerk', radius: 18, x: -933, y: -861 }, + { id: 80, label: 'Benjie Meedendorpe', radius: 18, x: -376, y: 7 }, + { id: 81, label: 'Gabbie Losselyong', radius: 18, x: -856, y: -904 }, + { id: 82, label: 'Bartholemy Heathcoat', radius: 18, x: -642, y: 967 }, + { id: 83, label: 'Johanna Silkstone', radius: 18, x: -354, y: -311 }, + { id: 84, label: 'Dix Maddra', radius: 18, x: 451, y: 430 }, + { id: 85, label: 'Jillana Farrent', radius: 18, x: 466, y: 233 }, + { id: 86, label: 'Mitzi Beaudry', radius: 18, x: -659, y: 594 }, + { id: 87, label: 'Tamera Lindsell', radius: 18, x: 808, y: -795 }, + { id: 88, label: 'Charlean Devitt', radius: 18, x: 57, y: -333 }, + { id: 89, label: 'Blondelle Burden', radius: 18, x: 365, y: 935 }, + { id: 90, label: 'Laurens Moller', radius: 18, x: 415, y: -586 }, + { id: 91, label: 'Eve Renehan', radius: 18, x: -591, y: -911 }, + { id: 92, label: 'Shae Heathcoat', radius: 18, x: 799, y: -98 }, + { id: 93, label: 'Flint Purry', radius: 18, x: -80, y: 657 }, + { id: 94, label: 'Theo Bahde', radius: 18, x: 719, y: 34 }, + { id: 95, label: 'Bobbie Riddler', radius: 18, x: 859, y: 802 }, + { id: 96, label: 'Nyssa McSorley', radius: 18, x: 501, y: 985 }, + { id: 97, label: 'Skell Broadfield', radius: 18, x: 805, y: 424 }, + { id: 98, label: 'Cedric Veivers', radius: 18, x: -667, y: 829 }, + { id: 99, label: 'Ara Brunetti', radius: 18, x: -180, y: 811 }, + { id: 100, label: 'Osborne Clevely', radius: 18, x: -458, y: -612 }, + { id: 101, label: 'Lyman Castilla', radius: 18, x: 829, y: 568 }, + { id: 102, label: 'Paten Cheer', radius: 18, x: 295, y: -204 }, + { id: 103, label: 'Elton Moffett', radius: 18, x: 63, y: -689 }, + { id: 104, label: 'Becki Weatherhead', radius: 18, x: -169, y: 851 }, + { id: 105, label: 'Warde Pettyfer', radius: 18, x: 434, y: -267 }, + { id: 106, label: 'Natalee Syncke', radius: 18, x: -906, y: 72 }, + { id: 107, label: 'Cody Gerritzen', radius: 18, x: 140, y: 90 }, + { id: 108, label: 'Ursala Hopkynson', radius: 18, x: 886, y: 687 }, + { id: 109, label: 'Tedman Bohlmann', radius: 18, x: 87, y: 701 }, + { id: 110, label: 'Juliane Doonican', radius: 18, x: -834, y: -415 }, + { id: 111, label: 'Vivianna Campey', radius: 18, x: 104, y: 633 }, + { id: 112, label: 'Bail Kairns', radius: 18, x: -692, y: 355 }, + { id: 113, label: 'Skyler Brixey', radius: 18, x: 304, y: 979 }, + { id: 114, label: 'Alisa Engledow', radius: 18, x: -299, y: -412 }, + { id: 115, label: 'Cecilio Morforth', radius: 18, x: -398, y: 67 }, + { id: 116, label: 'Rad Hoonahan', radius: 18, x: -452, y: -678 }, + { id: 117, label: 'Hesther Feetham', radius: 18, x: -12, y: -386 }, + { id: 118, label: 'Lynda Snelle', radius: 18, x: 631, y: -460 }, + { id: 119, label: 'Gwendolyn Santora', radius: 18, x: 455, y: 106 }, + { id: 120, label: 'Walt Longson', radius: 18, x: 176, y: 30 }, + { id: 121, label: 'Myrtice Gyver', radius: 18, x: 637, y: 520 }, + { id: 122, label: 'Elliot Dekeyser', radius: 18, x: -305, y: 473 }, + { id: 123, label: 'Nevile Ramelot', radius: 18, x: 462, y: 114 }, + { id: 124, label: 'Karalee Rodwell', radius: 18, x: -811, y: 3 }, + { id: 125, label: 'Ezequiel Sarfas', radius: 18, x: -208, y: -342 }, + { id: 126, label: 'Tobe Champkins', radius: 18, x: 60, y: 252 }, + { id: 127, label: 'Odessa Marcinkowski', radius: 18, x: -354, y: 355 }, + { id: 128, label: 'Irita Cranage', radius: 18, x: -603, y: 959 }, + { id: 129, label: 'Mandi Melley', radius: 18, x: 635, y: -445 }, + { id: 130, label: 'Guthry Shucksmith', radius: 18, x: 97, y: -309 }, + { id: 131, label: 'Ferdinanda Middlemist', radius: 18, x: -445, y: 180 }, + { id: 132, label: 'Emlyn Clemanceau', radius: 18, x: -289, y: -173 }, + { id: 133, label: 'Jewelle Bliss', radius: 18, x: -845, y: -801 }, + { id: 134, label: 'Kent Giacoppoli', radius: 18, x: 308, y: -329 }, + { id: 135, label: 'Hallsy Aronsohn', radius: 18, x: -156, y: 347 }, + { id: 136, label: 'Ellsworth Kemwal', radius: 18, x: -351, y: -238 }, + { id: 137, label: 'Haywood Trewinnard', radius: 18, x: 782, y: -885 }, + { id: 138, label: 'Hobey Crawshaw', radius: 18, x: 818, y: 459 }, + { id: 139, label: 'Powell Tregian', radius: 18, x: -807, y: -978 }, + { id: 140, label: 'Fergus Damiral', radius: 18, x: 759, y: -758 }, + { id: 141, label: 'Dari Strettle', radius: 18, x: 202, y: -383 }, + { id: 142, label: 'Pren Dockreay', radius: 18, x: -328, y: -542 }, + { id: 143, label: 'Reed Smails', radius: 18, x: -276, y: 351 }, + { id: 144, label: 'April Davydochkin', radius: 18, x: 395, y: 804 }, + { id: 145, label: 'Alix McCusker', radius: 18, x: 426, y: 979 }, + { id: 146, label: 'Ludovika Fetherstan', radius: 18, x: 494, y: -182 }, + { id: 147, label: 'Hermina Keets', radius: 18, x: 651, y: 625 }, + { id: 148, label: 'Whitaker Daughton', radius: 18, x: 557, y: 527 }, + { id: 149, label: 'Erik Chaney', radius: 18, x: -818, y: -963 }, + { id: 150, label: 'Torey Da Costa', radius: 18, x: 324, y: 713 }, + { id: 151, label: 'Sheffield Tuddall', radius: 18, x: 993, y: 264 }, + { id: 152, label: 'Morry Bolger', radius: 18, x: -727, y: 812 }, + { id: 153, label: 'Fonsie Joddens', radius: 18, x: 767, y: 986 }, + { id: 154, label: 'Sherri Baff', radius: 18, x: -126, y: 844 }, + { id: 155, label: 'Trevor Gettings', radius: 18, x: -239, y: 211 }, + { id: 156, label: 'Pall Rickert', radius: 18, x: 211, y: 871 }, + { id: 157, label: 'Immanuel Folan', radius: 18, x: 405, y: 630 }, + { id: 158, label: 'Jacinthe Drissell', radius: 18, x: 440, y: -852 }, + { id: 159, label: 'Aylmer Cohan', radius: 18, x: -367, y: -32 }, + { id: 160, label: 'Ortensia Sherwill', radius: 18, x: -646, y: -602 }, + { id: 161, label: 'Georgy Witherington', radius: 18, x: -275, y: -175 }, + { id: 162, label: 'Juliann Kibbel', radius: 18, x: -188, y: 294 }, + { id: 163, label: 'Halsey Mowbray', radius: 18, x: 394, y: 734 }, + { id: 164, label: 'Renard Itschakov', radius: 18, x: -105, y: -93 }, + { id: 165, label: 'Elnora Morton', radius: 18, x: 11, y: 631 }, + { id: 166, label: 'Clayton Dimnage', radius: 18, x: 749, y: 475 }, + { id: 167, label: 'Perceval Huxley', radius: 18, x: -294, y: -293 }, + { id: 168, label: 'Alyss Fincher', radius: 18, x: -923, y: 674 }, + { id: 169, label: 'Nydia Bettlestone', radius: 18, x: -737, y: -230 }, + { id: 170, label: 'Haily Fackney', radius: 18, x: 487, y: -408 }, + { id: 171, label: 'Tamar Hars', radius: 18, x: -925, y: 969 }, + { id: 172, label: 'Percival Annets', radius: 18, x: -220, y: 504 }, + { id: 173, label: 'Townie Polglase', radius: 18, x: 790, y: -428 }, + { id: 174, label: 'Fairfax Brede', radius: 18, x: -317, y: -874 }, + { id: 175, label: 'Verney Kobiera', radius: 18, x: -130, y: 944 }, + { id: 176, label: 'Roman Klimkin', radius: 18, x: -911, y: -988 }, + { id: 177, label: 'Brendon Rosnau', radius: 18, x: -591, y: 212 }, + { id: 178, label: 'Iain McGrane', radius: 18, x: 850, y: -14 }, + { id: 179, label: 'Karissa Minto', radius: 18, x: 682, y: 331 }, + { id: 180, label: 'Mayor Ferrettino', radius: 18, x: -158, y: 529 }, + { id: 181, label: 'Curran Waldram', radius: 18, x: -438, y: -58 }, + { id: 182, label: 'Kellina Strass', radius: 18, x: 577, y: -371 }, + { id: 183, label: 'Gregorius O Sullivan', radius: 18, x: 638, y: 47 }, + { id: 184, label: 'Sibby Derle', radius: 18, x: -384, y: -736 }, + { id: 185, label: 'Morgana Zamorrano', radius: 18, x: 767, y: -83 }, + { id: 186, label: 'Emalee Fenna', radius: 18, x: -248, y: -956 }, + { id: 187, label: 'Karissa Vegas', radius: 18, x: -665, y: 863 }, + { id: 188, label: 'Eduino Edmeades', radius: 18, x: 180, y: -339 }, + { id: 189, label: 'Garrik Jandak', radius: 18, x: -165, y: -733 }, + { id: 190, label: 'Doro Commuzzo', radius: 18, x: 885, y: -287 }, + { id: 191, label: 'Carri Barkly', radius: 18, x: 941, y: -552 }, + { id: 192, label: 'Cyndy Bassano', radius: 18, x: -780, y: -589 }, + { id: 193, label: 'Jessie Conry', radius: 18, x: 888, y: -238 }, + { id: 194, label: 'Delila Jay', radius: 18, x: 848, y: 220 }, + { id: 195, label: 'Hanan McInteer', radius: 18, x: 100, y: -427 }, + { id: 196, label: 'Nicolais Parmiter', radius: 18, x: -602, y: -881 }, + { id: 197, label: 'Christye Owers', radius: 18, x: 700, y: -967 }, + { id: 198, label: 'Giralda Claffey', radius: 18, x: -146, y: 981 }, + { id: 199, label: 'Benoite Klimpke', radius: 18, x: -298, y: -100 }, + { id: 200, label: 'Marisa Corkell', radius: 18, x: 946, y: -270 }, + { id: 201, label: 'Gilbertina Booi', radius: 18, x: 313, y: -33 }, + { id: 202, label: 'Alida Baulch', radius: 18, x: -849, y: 22 }, + { id: 203, label: 'Asa Luckman', radius: 18, x: 337, y: 189 }, + { id: 204, label: 'Carie MacLeod', radius: 18, x: -406, y: 463 }, + { id: 205, label: 'Hurley Abrami', radius: 18, x: -663, y: 304 }, + { id: 206, label: 'Lonna Unwin', radius: 18, x: 84, y: -978 }, + { id: 207, label: 'Chris Stoller', radius: 18, x: 114, y: 279 }, + { id: 208, label: 'Cybil Morican', radius: 18, x: -951, y: -759 }, + { id: 209, label: 'Sileas Siegertsz', radius: 18, x: 127, y: 78 }, + { id: 210, label: 'Deena Tilling', radius: 18, x: -557, y: -62 }, + { id: 211, label: 'Sibella Yeliashev', radius: 18, x: -899, y: 602 }, + { id: 212, label: 'Ethelbert Snare', radius: 18, x: 761, y: 739 }, + { id: 213, label: 'Donn Tarrant', radius: 18, x: 742, y: 336 }, + { id: 214, label: 'Ailsun Amphlett', radius: 18, x: -298, y: -143 }, + { id: 215, label: 'Ellery Avrahamy', radius: 18, x: -428, y: -652 }, + { id: 216, label: 'Guillemette Lindl', radius: 18, x: -721, y: -209 }, + { id: 217, label: 'Haskell Patel', radius: 18, x: -936, y: 254 }, + { id: 218, label: 'Blanch Iacovolo', radius: 18, x: -216, y: -498 }, + { id: 219, label: 'Betteanne Guillon', radius: 18, x: -591, y: 221 }, + { id: 220, label: 'Dorie Ferrillio', radius: 18, x: 763, y: -762 }, + { id: 221, label: 'Jeremie Hales', radius: 18, x: 790, y: 873 }, + { id: 222, label: 'Cleon Whitehouse', radius: 18, x: -71, y: 256 }, + { id: 223, label: 'Gabby Leeder', radius: 18, x: -349, y: -199 }, + { id: 224, label: 'Chariot Dilleway', radius: 18, x: -88, y: -724 }, + { id: 225, label: 'Aurora Whyman', radius: 18, x: -578, y: -86 }, + { id: 226, label: 'Antonie Tregonna', radius: 18, x: -103, y: -511 }, + { id: 227, label: 'Afton Simonetti', radius: 18, x: -706, y: -114 }, + { id: 228, label: 'Clarette Gingel', radius: 18, x: -458, y: 223 }, + { id: 229, label: 'Sadye Loffel', radius: 18, x: 453, y: 1 }, + { id: 230, label: 'Natty Charnock', radius: 18, x: 63, y: -168 }, + { id: 231, label: 'Phebe Lamey', radius: 18, x: -244, y: 660 }, + { id: 232, label: 'Garrett Mahaddy', radius: 18, x: -568, y: -398 }, + { id: 233, label: 'Waverly Smaleman', radius: 18, x: 465, y: 694 }, + { id: 234, label: 'Hermione Jarrard', radius: 18, x: -436, y: -889 }, + { id: 235, label: 'Fenelia Woodcraft', radius: 18, x: -512, y: -757 }, + { id: 236, label: 'Valenka Every', radius: 18, x: -495, y: -446 }, + { id: 237, label: 'Zacharia Bowra', radius: 18, x: -3, y: 293 }, + { id: 238, label: 'Kirbie Wyburn', radius: 18, x: 256, y: -129 }, + { id: 239, label: 'Ardith Hansel', radius: 18, x: 591, y: 947 }, + { id: 240, label: 'Rois Draisey', radius: 18, x: -803, y: 902 }, + { id: 241, label: 'Shirleen Shemmans', radius: 18, x: 312, y: 948 }, + { id: 242, label: 'Carly Priddey', radius: 18, x: -161, y: -961 }, + { id: 243, label: 'Nico Ornils', radius: 18, x: -602, y: -789 }, + { id: 244, label: 'Martelle Ranscomb', radius: 18, x: -966, y: -45 }, + { id: 245, label: 'Roxie Di Roberto', radius: 18, x: -1001, y: 673 }, + { id: 246, label: 'Darell Collingridge', radius: 18, x: 818, y: 236 }, + { id: 247, label: 'Jerry Brotheridge', radius: 18, x: 976, y: -894 }, + { id: 248, label: 'Lindon McKie', radius: 18, x: 247, y: -417 }, + { id: 249, label: 'Brittany Clynman', radius: 18, x: -728, y: -248 }, + { id: 250, label: 'Ileana Menary', radius: 18, x: -815, y: 856 }, + { id: 251, label: 'Elroy Follacaro', radius: 18, x: -441, y: -651 }, + { id: 252, label: 'Cathryn Dunster', radius: 18, x: -752, y: 993 }, + { id: 253, label: 'Corny Greensmith', radius: 18, x: -896, y: 534 }, + { id: 254, label: 'Frannie Kalinovich', radius: 18, x: 660, y: -677 }, + { id: 255, label: 'Angeline Pirolini', radius: 18, x: -1001, y: -625 }, + { id: 256, label: 'Codie MacGown', radius: 18, x: -193, y: -470 }, + { id: 257, label: 'Dom Greystock', radius: 18, x: 61, y: 154 }, + { id: 258, label: 'Udell Baldrick', radius: 18, x: -694, y: 319 }, + { id: 259, label: 'Kimmy Sinyard', radius: 18, x: 75, y: -500 }, + { id: 260, label: 'Meris Andrelli', radius: 18, x: 437, y: -821 }, + { id: 261, label: 'Steffie Spray', radius: 18, x: -312, y: -906 }, + { id: 262, label: 'Chrystal Laxson', radius: 18, x: -889, y: -880 }, + { id: 263, label: 'Analiese Petcher', radius: 18, x: 297, y: -446 }, + { id: 264, label: 'Erich Lydden', radius: 18, x: -878, y: -21 }, + { id: 265, label: 'Sandra Legat', radius: 18, x: -962, y: -176 }, + { id: 266, label: 'Carce Akam', radius: 18, x: -699, y: -767 }, + { id: 267, label: 'Shay Uridge', radius: 18, x: 82, y: -702 }, + { id: 268, label: 'Georgena Dineges', radius: 18, x: -218, y: -707 }, + { id: 269, label: 'Iolande Peeke-Vout', radius: 18, x: 748, y: 792 }, + { id: 270, label: 'Bronny Bremen', radius: 18, x: 915, y: -723 }, + { id: 271, label: 'Moe Klammt', radius: 18, x: -367, y: 441 }, + { id: 272, label: 'Barrie Hadlee', radius: 18, x: 498, y: 576 }, + { id: 273, label: 'Thorstein Doxey', radius: 18, x: 106, y: -673 }, + { id: 274, label: 'Orrin Gillett', radius: 18, x: -263, y: 783 }, + { id: 275, label: 'Clement Handscombe', radius: 18, x: 430, y: 952 }, + { id: 276, label: 'Aurea MacLeese', radius: 18, x: 624, y: 814 }, + { id: 277, label: 'Katlin Polly', radius: 18, x: -621, y: 972 }, + { id: 278, label: 'Cathy Leyrroyd', radius: 18, x: 589, y: 550 }, + { id: 279, label: 'Gelya Maseres', radius: 18, x: 171, y: -960 }, + { id: 280, label: 'Jessika Ansett', radius: 18, x: -626, y: 454 }, + { id: 281, label: 'Bel Matzkaitis', radius: 18, x: 919, y: 222 }, + { id: 282, label: 'Devin Rego', radius: 18, x: -895, y: -265 }, + { id: 283, label: 'Sue Zelland', radius: 18, x: -320, y: -655 }, + { id: 284, label: 'Ernestus Champness', radius: 18, x: 974, y: 477 }, + { id: 285, label: 'Guillemette Denyakin', radius: 18, x: -470, y: 727 }, + { id: 286, label: 'Giovanni Bromehed', radius: 18, x: -376, y: 889 }, + { id: 287, label: 'Egor Hatherleigh', radius: 18, x: 848, y: -897 }, + { id: 288, label: 'Celestina Braffington', radius: 18, x: 268, y: -368 }, + { id: 289, label: 'Faydra Winward', radius: 18, x: 796, y: 976 }, + { id: 290, label: 'Rivy Vardey', radius: 18, x: 61, y: 418 }, + { id: 291, label: 'Ario Albasiny', radius: 18, x: -93, y: -402 }, + { id: 292, label: 'Fionna de Banke', radius: 18, x: -896, y: 653 }, + { id: 293, label: 'Kiah Van der Velden', radius: 18, x: 322, y: 396 }, + { id: 294, label: 'Hilliard Boribal', radius: 18, x: -55, y: 132 }, + { id: 295, label: 'Demott Slesser', radius: 18, x: -337, y: 337 }, + { id: 296, label: 'Florence Uccelli', radius: 18, x: -267, y: 62 }, + { id: 297, label: 'Kirbee Ambrosoli', radius: 18, x: 333, y: -854 }, + { id: 298, label: 'Ranice Atcherley', radius: 18, x: -14, y: 16 }, + { id: 299, label: 'Cully Colchett', radius: 18, x: 231, y: 625 }, + { id: 300, label: 'Reece Aspling', radius: 18, x: -764, y: 715 }, + { id: 301, label: 'Philomena Dossit', radius: 18, x: -174, y: 777 }, + { id: 302, label: 'Lani Bignall', radius: 18, x: 70, y: -409 }, + { id: 303, label: 'Maybelle Gannicleff', radius: 18, x: 637, y: 651 }, + { id: 304, label: 'Sydel Bresner', radius: 18, x: 64, y: 356 }, + { id: 305, label: 'Gerhard Cavanaugh', radius: 18, x: 307, y: 646 }, + { id: 306, label: 'Clare Sommerling', radius: 18, x: -922, y: -342 }, + { id: 307, label: 'Mendel Bendin', radius: 18, x: 474, y: -937 }, + { id: 308, label: 'Lisa Stubbins', radius: 18, x: 547, y: -172 }, + { id: 309, label: 'Bealle Claque', radius: 18, x: -382, y: 352 }, + { id: 310, label: 'Micah Ajean', radius: 18, x: 183, y: 930 }, + { id: 311, label: 'Lura Kemmer', radius: 18, x: 472, y: 245 }, + { id: 312, label: 'Meagan Pointon', radius: 18, x: 793, y: -621 }, + { id: 313, label: 'Connor Rickeard', radius: 18, x: -916, y: -471 }, + { id: 314, label: 'Madalyn Anfossi', radius: 18, x: 580, y: -1000 }, + { id: 315, label: "Goober O'Connel", radius: 18, x: 93, y: -477 }, + { id: 316, label: 'Luelle Last', radius: 18, x: 395, y: -45 }, + { id: 317, label: 'Rozelle Chellenham', radius: 18, x: 648, y: -366 }, + { id: 318, label: 'Doralynn Agott', radius: 18, x: -731, y: -105 }, + { id: 319, label: 'Bette Layzell', radius: 18, x: -145, y: -641 }, + { id: 320, label: 'Salvidor Oliveras', radius: 18, x: -315, y: -584 }, + { id: 321, label: 'Mayor Cuffin', radius: 18, x: 750, y: 677 }, + { id: 322, label: 'Bendick Romaynes', radius: 18, x: 134, y: -955 }, + { id: 323, label: 'Elsy Josefer', radius: 18, x: 400, y: 477 }, + { id: 324, label: 'Murray Athowe', radius: 18, x: 469, y: 642 }, + { id: 325, label: 'Tuesday Trudgian', radius: 18, x: -946, y: 345 }, + { id: 326, label: 'Leone Spurdens', radius: 18, x: -940, y: 642 }, + { id: 327, label: 'Ardine Brafield', radius: 18, x: 502, y: 981 }, + { id: 328, label: 'Salem Georgelin', radius: 18, x: -80, y: -372 }, + { id: 329, label: 'Bank Fanshawe', radius: 18, x: 415, y: -14 }, + { id: 330, label: 'Sarge Dyhouse', radius: 18, x: -449, y: -875 }, + { id: 331, label: 'Wynne Realph', radius: 18, x: -310, y: -83 }, + { id: 332, label: 'Romy Lauderdale', radius: 18, x: 22, y: -605 }, + { id: 333, label: 'Corinna Gilberthorpe', radius: 18, x: 916, y: -318 }, + { id: 334, label: 'Clayton Attril', radius: 18, x: -73, y: -901 }, + { id: 335, label: 'Candi Duns', radius: 18, x: 921, y: -123 }, + { id: 336, label: 'Lynnelle Stapleford', radius: 18, x: -939, y: -984 }, + { id: 337, label: 'Olympia Millward', radius: 18, x: 404, y: 818 }, + { id: 338, label: 'Evey Lambirth', radius: 18, x: -920, y: -16 }, + { id: 339, label: 'Bessy Rosenfield', radius: 18, x: 676, y: 903 }, + { id: 340, label: 'Bev Skyme', radius: 18, x: 660, y: 929 }, + { id: 341, label: 'Konrad Leaver', radius: 18, x: 791, y: -941 }, + { id: 342, label: 'Way Ladley', radius: 18, x: -594, y: 244 }, + { id: 343, label: 'Antonietta Dorward', radius: 18, x: 769, y: -287 }, + { id: 344, label: 'Maryjo Hendrick', radius: 18, x: 660, y: -994 }, + { id: 345, label: 'Eldin Sudy', radius: 18, x: 299, y: 856 }, + { id: 346, label: 'Scot Toppes', radius: 18, x: -459, y: -175 }, + { id: 347, label: 'Lanita Haskayne', radius: 18, x: -234, y: 283 }, + { id: 348, label: 'Brant Hanscombe', radius: 18, x: -478, y: 910 }, + { id: 349, label: 'Netta Ballham', radius: 18, x: 765, y: 846 }, + { id: 350, label: 'Martita Donett', radius: 18, x: -853, y: -758 }, + { id: 351, label: 'Robinia Autie', radius: 18, x: 722, y: 431 }, + { id: 352, label: 'Emmalynn Purser', radius: 18, x: 613, y: -692 }, + { id: 353, label: 'Rubie Gravenor', radius: 18, x: -899, y: 87 }, + { id: 354, label: 'Viole Samworth', radius: 18, x: 126, y: 744 }, + { id: 355, label: 'Modesta Sprionghall', radius: 18, x: 697, y: -746 }, + { id: 356, label: 'Rafaellle Missington', radius: 18, x: 759, y: 842 }, + { id: 357, label: 'Modesta Bazire', radius: 18, x: -136, y: 530 }, + { id: 358, label: 'Durward Spincks', radius: 18, x: 507, y: -705 }, + { id: 359, label: 'Sunny Schouthede', radius: 18, x: 83, y: -571 }, + { id: 360, label: 'Tiffy Weond', radius: 18, x: -587, y: 789 }, + { id: 361, label: 'Mollee Letch', radius: 18, x: -455, y: -482 }, + { id: 362, label: 'Cherlyn Aveling', radius: 18, x: -162, y: 982 }, + { id: 363, label: 'Mellisent Aldrin', radius: 18, x: 236, y: 459 }, + { id: 364, label: 'Aubine Izkovicz', radius: 18, x: 862, y: -710 }, + { id: 365, label: 'Alyosha Nestor', radius: 18, x: -146, y: 39 }, + { id: 366, label: 'Lois Sillick', radius: 18, x: 329, y: -111 }, + { id: 367, label: 'Harley Dunthorne', radius: 18, x: -453, y: 759 }, + { id: 368, label: 'Ase McGibbon', radius: 18, x: 968, y: 672 }, + { id: 369, label: 'Livvy Grube', radius: 18, x: -69, y: -712 }, + { id: 370, label: 'Hildegaard Newland', radius: 18, x: 792, y: 687 }, + { id: 371, label: 'Billy Borgnet', radius: 18, x: 21, y: -262 }, + { id: 372, label: 'Nani Pittham', radius: 18, x: 835, y: -843 }, + { id: 373, label: 'Brittney Holywell', radius: 18, x: -773, y: 515 }, + { id: 374, label: 'Merrilee Surmeyer', radius: 18, x: -562, y: -561 }, + { id: 375, label: 'Olva Falkner', radius: 18, x: -384, y: -661 }, + { id: 376, label: 'Marina Knagges', radius: 18, x: -498, y: -730 }, + { id: 377, label: 'Mavis Pheazey', radius: 18, x: -177, y: 486 }, + { id: 378, label: 'Nappie Vanderplas', radius: 18, x: -181, y: -55 }, + { id: 379, label: 'Sukey Litchmore', radius: 18, x: -247, y: -784 }, + { id: 380, label: 'Wilfred Merigot', radius: 18, x: 11, y: -232 }, + { id: 381, label: 'Harvey Bonney', radius: 18, x: -82, y: 618 }, + { id: 382, label: 'Skell Billsberry', radius: 18, x: 151, y: 927 }, + { id: 383, label: 'Jereme Piola', radius: 18, x: 887, y: -173 }, + { id: 384, label: 'Dix Denniss', radius: 18, x: 550, y: -519 }, + { id: 385, label: 'Irv Mantione', radius: 18, x: -800, y: -85 }, + { id: 386, label: 'Emelina Glowacki', radius: 18, x: -926, y: 801 }, + { id: 387, label: 'Kyrstin Leetham', radius: 18, x: -734, y: 165 }, + { id: 388, label: 'Julianne Halls', radius: 18, x: 414, y: 242 }, + { id: 389, label: 'Franky Clench', radius: 18, x: -853, y: -410 }, + { id: 390, label: 'Jacqueline Hamman', radius: 18, x: -938, y: -721 }, + { id: 391, label: 'Magdalen Vanacci', radius: 18, x: -438, y: -745 }, + { id: 392, label: 'Michail Whitesel', radius: 18, x: 711, y: 162 }, + { id: 393, label: 'Jessamyn Masters', radius: 18, x: -585, y: 371 }, + { id: 394, label: 'Shurlock Tripe', radius: 18, x: 392, y: -504 }, + { id: 395, label: 'Demetra Scyner', radius: 18, x: -588, y: -109 }, + { id: 396, label: 'Bobette Strangman', radius: 18, x: 951, y: 536 }, + { id: 397, label: 'Xenos Seleway', radius: 18, x: -519, y: 473 }, + { id: 398, label: 'Sarah Worboy', radius: 18, x: 809, y: -664 }, + { id: 399, label: 'Row Berick', radius: 18, x: -88, y: 995 }, + { id: 400, label: 'Catharine Gimber', radius: 18, x: -747, y: 553 }, + { id: 401, label: 'Wendall Smedley', radius: 18, x: -953, y: -681 }, + { id: 402, label: 'Eydie Hains', radius: 18, x: -708, y: -29 }, + { id: 403, label: 'Cathlene Gallo', radius: 18, x: -470, y: -830 }, + { id: 404, label: 'Jillie Matissoff', radius: 18, x: 424, y: -498 }, + { id: 405, label: 'Evyn McCloud', radius: 18, x: -302, y: 908 }, + { id: 406, label: 'Orrin Wickersley', radius: 18, x: -507, y: 175 }, + { id: 407, label: 'Eustacia Frift', radius: 18, x: -401, y: 648 }, + { id: 408, label: 'Milt Borsi', radius: 18, x: -142, y: -567 }, + { id: 409, label: 'Dolph Hames', radius: 18, x: -649, y: 829 }, + { id: 410, label: 'Agnese Dockrell', radius: 18, x: -136, y: -828 }, + { id: 411, label: 'Tanner Tattersfield', radius: 18, x: -414, y: -194 }, + { id: 412, label: 'Walker Duligal', radius: 18, x: -70, y: -269 }, + { id: 413, label: 'Ronnie Strognell', radius: 18, x: -529, y: 752 }, + { id: 414, label: 'Tarah Binfield', radius: 18, x: -440, y: 307 }, + { id: 415, label: 'Andreana Danko', radius: 18, x: -710, y: 924 }, + { id: 416, label: 'Alvina Mesnard', radius: 18, x: -851, y: -24 }, + { id: 417, label: 'Tildie Spini', radius: 18, x: -106, y: -378 }, + { id: 418, label: 'Val Walklott', radius: 18, x: -662, y: -593 }, + { id: 419, label: 'Rowland Brahan', radius: 18, x: 800, y: -167 }, + { id: 420, label: 'Elisabeth Dudson', radius: 18, x: -121, y: -137 }, + { id: 421, label: 'Inigo Simononsky', radius: 18, x: 210, y: -466 }, + { id: 422, label: 'Albina Neads', radius: 18, x: 88, y: -59 }, + { id: 423, label: 'Wolfy Burgyn', radius: 18, x: 652, y: 602 }, + { id: 424, label: 'Trista Noblet', radius: 18, x: -556, y: 906 }, + { id: 425, label: 'Babbie Rielly', radius: 18, x: 712, y: -90 }, + { id: 426, label: 'Rochella Adamolli', radius: 18, x: 541, y: 26 }, + { id: 427, label: 'Chrisse Collimore', radius: 18, x: 710, y: -759 }, + { id: 428, label: 'Hynda Bosnell', radius: 18, x: -991, y: -250 }, + { id: 429, label: 'Sherline Featonby', radius: 18, x: 986, y: 450 }, + { id: 430, label: 'Milty Purkins', radius: 18, x: -155, y: -205 }, + { id: 431, label: "Sonya O'Heyne", radius: 18, x: 614, y: -491 }, + { id: 432, label: 'Cicely Buffy', radius: 18, x: -485, y: 408 }, + { id: 433, label: 'Ursulina Thomas', radius: 18, x: 717, y: -376 }, + { id: 434, label: 'Ina Dane', radius: 18, x: -714, y: 632 }, + { id: 435, label: 'Sawyer Beyer', radius: 18, x: -762, y: 714 }, + { id: 436, label: 'Flory Rubinovici', radius: 18, x: -813, y: 966 }, + { id: 437, label: 'Graig Coulling', radius: 18, x: 121, y: 523 }, + { id: 438, label: 'Jonas Niece', radius: 18, x: -938, y: 884 }, + { id: 439, label: 'Odelinda Jillett', radius: 18, x: 397, y: 996 }, + { id: 440, label: 'Maison Garford', radius: 18, x: -654, y: -18 }, + { id: 441, label: 'Britt Juliano', radius: 18, x: 982, y: -122 }, + { id: 442, label: 'Zarla Keenlyside', radius: 18, x: -479, y: -648 }, + { id: 443, label: 'Field Handes', radius: 18, x: -161, y: 185 }, + { id: 444, label: 'Niall Deedes', radius: 18, x: -206, y: -515 }, + { id: 445, label: 'Brett Atlay', radius: 18, x: 324, y: 935 }, + { id: 446, label: 'Yetta Bruin', radius: 18, x: -690, y: -604 }, + { id: 447, label: 'Sasha Klemmt', radius: 18, x: -592, y: -875 }, + { id: 448, label: 'Kimberli Bellringer', radius: 18, x: -259, y: 110 }, + { id: 449, label: 'Leola Henner', radius: 18, x: -590, y: -865 }, + { id: 450, label: 'Yankee Train', radius: 18, x: -483, y: 815 }, + { id: 451, label: 'Bernard Laurenty', radius: 18, x: -887, y: -755 }, + { id: 452, label: 'Wilone Venable', radius: 18, x: -719, y: 663 }, + { id: 453, label: 'Marc Adanez', radius: 18, x: -435, y: -686 }, + { id: 454, label: "Torrie O'Shavlan", radius: 18, x: -676, y: -34 }, + { id: 455, label: 'Sammy Padgett', radius: 18, x: -396, y: 901 }, + { id: 456, label: 'Derward Goodred', radius: 18, x: 438, y: -722 }, + { id: 457, label: 'Kit Free', radius: 18, x: -965, y: 114 }, + { id: 458, label: 'Robert Liddyard', radius: 18, x: 349, y: 109 }, + { id: 459, label: 'Cullan Espinal', radius: 18, x: 526, y: -841 }, + { id: 460, label: 'Ives Dalinder', radius: 18, x: 891, y: -226 }, + { id: 461, label: 'Harri Wormald', radius: 18, x: 499, y: -154 }, + { id: 462, label: 'Angil Cudbird', radius: 18, x: -432, y: 588 }, + { id: 463, label: 'Nat Chafney', radius: 18, x: -917, y: -259 }, + { id: 464, label: 'Simeon Mower', radius: 18, x: -967, y: 26 }, + { id: 465, label: 'Reider Goade', radius: 18, x: 605, y: -689 }, + { id: 466, label: 'Ardis Begin', radius: 18, x: -30, y: -47 }, + { id: 467, label: 'Kirby Whartonby', radius: 18, x: 431, y: 24 }, + { id: 468, label: 'Ronna MacGuiness', radius: 18, x: -906, y: -3 }, + { id: 469, label: 'Tate Wilgar', radius: 18, x: 161, y: -700 }, + { id: 470, label: 'Janelle Fyfield', radius: 18, x: -424, y: 154 }, + { id: 471, label: 'Joeann Yurevich', radius: 18, x: 171, y: 131 }, + { id: 472, label: 'Saunders Scurrey', radius: 18, x: 105, y: 223 }, + { id: 473, label: 'Olly Harbertson', radius: 18, x: -598, y: 730 }, + { id: 474, label: 'Merilyn Neissen', radius: 18, x: -658, y: 449 }, + { id: 475, label: 'Algernon Teare', radius: 18, x: 227, y: -872 }, + { id: 476, label: 'Dorene Nockalls', radius: 18, x: 446, y: 310 }, + { id: 477, label: 'Davita Ledrun', radius: 18, x: 96, y: -701 }, + { id: 478, label: 'Sheila-kathryn Fishbourne', radius: 18, x: -588, y: -580 }, + { id: 479, label: 'Sig MacFayden', radius: 18, x: 601, y: 941 }, + { id: 480, label: 'Gwendolen Gerardot', radius: 18, x: 986, y: 279 }, + { id: 481, label: 'Beck Champness', radius: 18, x: -527, y: 303 }, + { id: 482, label: 'Christie Enders', radius: 18, x: 696, y: 186 }, + { id: 483, label: 'Salli Clear', radius: 18, x: 19, y: 129 }, + { id: 484, label: 'Lovell Taunton.', radius: 18, x: 379, y: 275 }, + { id: 485, label: 'Sophronia Filmer', radius: 18, x: 999, y: 410 }, + { id: 486, label: 'Tallulah Prangley', radius: 18, x: 882, y: -859 }, + { id: 487, label: 'Joannes Beardsley', radius: 18, x: 219, y: -994 }, + { id: 488, label: 'Nicky Bussey', radius: 18, x: 50, y: -649 }, + { id: 489, label: 'Maybelle Ballantyne', radius: 18, x: 440, y: 496 }, + { id: 490, label: 'Eldin Lidgley', radius: 18, x: 946, y: -335 }, + { id: 491, label: 'Aloin Dobrowolny', radius: 18, x: -869, y: -341 }, + { id: 492, label: 'Donelle Colleran', radius: 18, x: 451, y: -974 }, + { id: 493, label: 'Ora Lamers', radius: 18, x: 119, y: 738 }, + { id: 494, label: 'Cass Maginn', radius: 18, x: -412, y: 921 }, + { id: 495, label: 'Damiano Trigg', radius: 18, x: 966, y: -246 }, + { id: 496, label: 'Manny Shorey', radius: 18, x: 872, y: -185 }, + { id: 497, label: 'Shadow Drohun', radius: 18, x: -26, y: 132 }, + { id: 498, label: 'Carena Riseam', radius: 18, x: 527, y: -57 }, + { id: 499, label: 'Huntley Van den Dael', radius: 18, x: 212, y: -793 }, + { id: 500, label: 'Jammie Kleinzweig', radius: 18, x: -394, y: -647 }, + { id: 501, label: 'Mohandis Aindrais', radius: 18, x: -390, y: -486 }, + { id: 502, label: 'Mureil Firby', radius: 18, x: -717, y: 112 }, + { id: 503, label: 'Terrye Kilkenny', radius: 18, x: 424, y: 481 }, + { id: 504, label: 'Mathilde Jays', radius: 18, x: 9, y: -189 }, + { id: 505, label: 'Georgie Pesic', radius: 18, x: -162, y: 709 }, + { id: 506, label: 'Elinor Londesborough', radius: 18, x: -611, y: -825 }, + { id: 507, label: 'Talbot Marousek', radius: 18, x: 289, y: 188 }, + { id: 508, label: 'Daisie Snelle', radius: 18, x: -761, y: -236 }, + { id: 509, label: 'Genevra Klaesson', radius: 18, x: -399, y: -639 }, + { id: 510, label: 'Tasia Twentyman', radius: 18, x: 807, y: 321 }, + { id: 511, label: 'Rolfe Westberg', radius: 18, x: -698, y: -339 }, + { id: 512, label: 'Isador Mease', radius: 18, x: 690, y: -757 }, + { id: 513, label: 'Johny Van Rembrandt', radius: 18, x: 476, y: 879 }, + { id: 514, label: 'Eduard Woolner', radius: 18, x: 800, y: 852 }, + { id: 515, label: 'Pete Angeau', radius: 18, x: -87, y: -76 }, + { id: 516, label: 'Conn Pover', radius: 18, x: -513, y: 48 }, + { id: 517, label: 'Cirillo Kelsell', radius: 18, x: 584, y: -188 }, + { id: 518, label: 'Joleen Verny', radius: 18, x: 403, y: 753 }, + { id: 519, label: 'Letta Rundall', radius: 18, x: -533, y: -732 }, + { id: 520, label: 'Tatum Luxen', radius: 18, x: -22, y: -197 }, + { id: 521, label: 'Glyn Angier', radius: 18, x: -664, y: 950 }, + { id: 522, label: 'Fenelia Pren', radius: 18, x: 518, y: -619 }, + { id: 523, label: 'Martyn MacAndrew', radius: 18, x: 856, y: -541 }, + { id: 524, label: 'Deloria Pauncefoot', radius: 18, x: -920, y: -788 }, + { id: 525, label: 'Hubie Chappell', radius: 18, x: 560, y: -21 }, + { id: 526, label: 'Eberhard Ricardot', radius: 18, x: -792, y: -762 }, + { id: 527, label: 'Tracie MacFadin', radius: 18, x: 959, y: -700 }, + { id: 528, label: 'Cherice Revett', radius: 18, x: 48, y: 727 }, + { id: 529, label: 'Sigismond Pau', radius: 18, x: -565, y: -932 }, + { id: 530, label: 'Iain Ioan', radius: 18, x: -605, y: 461 }, + { id: 531, label: 'Darcie Penylton', radius: 18, x: 926, y: 890 }, + { id: 532, label: 'Geri Boater', radius: 18, x: 602, y: -342 }, + { id: 533, label: 'Maryellen Benoit', radius: 18, x: 358, y: -72 }, + { id: 534, label: 'Haleigh Hawkeswood', radius: 18, x: 327, y: -470 }, + { id: 535, label: 'Adelaida Odgaard', radius: 18, x: 946, y: 721 }, + { id: 536, label: 'Horace Shewery', radius: 18, x: -385, y: 349 }, + { id: 537, label: 'Son Cowmeadow', radius: 18, x: 29, y: -824 }, + { id: 538, label: 'Laure McCarrison', radius: 18, x: 42, y: -447 }, + { id: 539, label: 'Caresa Lawford', radius: 18, x: -902, y: 854 }, + { id: 540, label: 'Christen Wellman', radius: 18, x: 301, y: -315 }, + { id: 541, label: 'Darcie Wardrop', radius: 18, x: 303, y: -731 }, + { id: 542, label: 'Gray Cosens', radius: 18, x: -92, y: 299 }, + { id: 543, label: 'Dario Hardesty', radius: 18, x: 851, y: -440 }, + { id: 544, label: 'Omar Bernini', radius: 18, x: 507, y: 158 }, + { id: 545, label: 'Alicia Southouse', radius: 18, x: 704, y: 269 }, + { id: 546, label: 'Bord Le Bosse', radius: 18, x: 921, y: 196 }, + { id: 547, label: 'Linda Lis', radius: 18, x: 939, y: -293 }, + { id: 548, label: 'Lissa Stife', radius: 18, x: -896, y: -784 }, + { id: 549, label: 'Jeralee Ferminger', radius: 18, x: -683, y: -600 }, + { id: 550, label: 'Nixie Burditt', radius: 18, x: 418, y: -804 }, + { id: 551, label: 'Hakeem Grellier', radius: 18, x: -546, y: 460 }, + { id: 552, label: 'Maurene Elliott', radius: 18, x: 571, y: 509 }, + { id: 553, label: 'Nicolle Adlam', radius: 18, x: 866, y: -594 }, + { id: 554, label: 'Sydel Dodshun', radius: 18, x: -848, y: -2 }, + { id: 555, label: 'Lodovico Decreuze', radius: 18, x: -456, y: -886 }, + { id: 556, label: 'Siana Brunnen', radius: 18, x: 909, y: -780 }, + { id: 557, label: 'Elsi Shalders', radius: 18, x: -4, y: -326 }, + { id: 558, label: 'Katheryn Skeen', radius: 18, x: -728, y: -980 }, + { id: 559, label: 'Chelsie Dowbakin', radius: 18, x: 93, y: 913 }, + { id: 560, label: 'Ermentrude Sacker', radius: 18, x: 348, y: 392 }, + { id: 561, label: 'Tomaso De Gregorio', radius: 18, x: -196, y: 670 }, + { id: 562, label: 'Eudora Okenden', radius: 18, x: -953, y: -972 }, + { id: 563, label: 'Derk Laterza', radius: 18, x: -364, y: -444 }, + { id: 564, label: 'Ed Brokenshaw', radius: 18, x: -298, y: -232 }, + { id: 565, label: 'Anatola Rennebeck', radius: 18, x: -335, y: -277 }, + { id: 566, label: 'Dela Leathers', radius: 18, x: 215, y: 14 }, + { id: 567, label: 'Wye Oldam', radius: 18, x: 469, y: 841 }, + { id: 568, label: 'Quint Tayt', radius: 18, x: 133, y: -129 }, + { id: 569, label: 'Martina Delagua', radius: 18, x: -693, y: 51 }, + { id: 570, label: 'Candie Gladstone', radius: 18, x: 550, y: 436 }, + { id: 571, label: 'Angelo Pierrepont', radius: 18, x: -735, y: -45 }, + { id: 572, label: 'Quinta Pace', radius: 18, x: -129, y: -418 }, + { id: 573, label: 'Flemming Schellig', radius: 18, x: -144, y: 941 }, + { id: 574, label: 'Cordell Keers', radius: 18, x: 839, y: -415 }, + { id: 575, label: 'Giulia Denmead', radius: 18, x: 576, y: -636 }, + { id: 576, label: 'Torre Bassingden', radius: 18, x: 953, y: -601 }, + { id: 577, label: 'Eartha Berriball', radius: 18, x: 432, y: 934 }, + { id: 578, label: 'Florencia Convery', radius: 18, x: -172, y: 329 }, + { id: 579, label: 'Rubetta Trevain', radius: 18, x: 843, y: 878 }, + { id: 580, label: 'Madeline Fuggles', radius: 18, x: 333, y: 112 }, + { id: 581, label: 'Skell Grebbin', radius: 18, x: 919, y: -567 }, + { id: 582, label: 'Isaac Cumes', radius: 18, x: 699, y: 12 }, + { id: 583, label: 'Lynsey Crichmere', radius: 18, x: -48, y: -321 }, + { id: 584, label: 'Yalonda Walford', radius: 18, x: 669, y: -158 }, + { id: 585, label: 'Quintus Peealess', radius: 18, x: 140, y: -338 }, + { id: 586, label: 'Biddie Morrow', radius: 18, x: 786, y: -915 }, + { id: 587, label: 'Ron Fairbrass', radius: 18, x: -705, y: -282 }, + { id: 588, label: 'Ilse Arnatt', radius: 18, x: 750, y: 277 }, + { id: 589, label: 'Yancey Torbett', radius: 18, x: 591, y: -929 }, + { id: 590, label: 'Eddie Achromov', radius: 18, x: -344, y: 542 }, + { id: 591, label: 'Nial Aynold', radius: 18, x: -457, y: -508 }, + { id: 592, label: 'Sandie Blumer', radius: 18, x: 996, y: 338 }, + { id: 593, label: 'Clifford Joskowitz', radius: 18, x: 998, y: 817 }, + { id: 594, label: 'Conroy Arnley', radius: 18, x: 816, y: 365 }, + { id: 595, label: 'Aimee McVity', radius: 18, x: 978, y: -532 }, + { id: 596, label: 'Lambert Pinard', radius: 18, x: -40, y: 213 }, + { id: 597, label: 'Adolph De Andreis', radius: 18, x: 207, y: -641 }, + { id: 598, label: 'Rorke Hanlin', radius: 18, x: -247, y: 680 }, + { id: 599, label: 'Arne Grimsley', radius: 18, x: 900, y: -504 }, + { id: 600, label: 'Simmonds Bernardotti', radius: 18, x: 55, y: 985 }, + { id: 601, label: 'Fredric MacIan', radius: 18, x: 572, y: 358 }, + { id: 602, label: "Angelia O'Heffernan", radius: 18, x: -350, y: -222 }, + { id: 603, label: 'Bevvy Padley', radius: 18, x: -432, y: -716 }, + { id: 604, label: 'Taddeo Beevers', radius: 18, x: 994, y: -80 }, + { id: 605, label: 'Neila Ziemke', radius: 18, x: -867, y: 694 }, + { id: 606, label: 'Roseanne Gerner', radius: 18, x: -100, y: -588 }, + { id: 607, label: 'Stephie Rollinshaw', radius: 18, x: -518, y: -496 }, + { id: 608, label: 'Anjela Gwalter', radius: 18, x: 977, y: 422 }, + { id: 609, label: 'Ricardo Levick', radius: 18, x: -974, y: 554 }, + { id: 610, label: 'Tomlin McKelvie', radius: 18, x: 326, y: -163 }, + { id: 611, label: 'Barbara-anne Hearson', radius: 18, x: -373, y: -994 }, + { id: 612, label: 'Leticia Sodeau', radius: 18, x: -437, y: 700 }, + { id: 613, label: 'Nessi Klein', radius: 18, x: 170, y: 17 }, + { id: 614, label: 'Shannan Kindleside', radius: 18, x: -429, y: 726 }, + { id: 615, label: 'Beryle Muglestone', radius: 18, x: 537, y: 835 }, + { id: 616, label: 'Kippar Killingbeck', radius: 18, x: -310, y: 801 }, + { id: 617, label: 'Torin Pedro', radius: 18, x: -874, y: 158 }, + { id: 618, label: 'Fulton Sawell', radius: 18, x: -613, y: 323 }, + { id: 619, label: 'Crista Fishbourn', radius: 18, x: 641, y: 2 }, + { id: 620, label: 'Jandy Chaves', radius: 18, x: 775, y: -646 }, + { id: 621, label: 'Sileas Kroin', radius: 18, x: 152, y: 376 }, + { id: 622, label: 'Leeann Akker', radius: 18, x: -350, y: -237 }, + { id: 623, label: 'Ignaz Crisall', radius: 18, x: 439, y: 841 }, + { id: 624, label: 'Cecil Von Der Empten', radius: 18, x: 288, y: 930 }, + { id: 625, label: 'Binnie Giraudat', radius: 18, x: 31, y: 372 }, + { id: 626, label: 'Edvard Diprose', radius: 18, x: -970, y: 256 }, + { id: 627, label: 'Elsi Grise', radius: 18, x: 627, y: 401 }, + { id: 628, label: 'Peterus DeSousa', radius: 18, x: 315, y: -333 }, + { id: 629, label: 'Mehetabel McAlpin', radius: 18, x: 293, y: -891 }, + { id: 630, label: 'Barnard Cobbled', radius: 18, x: 367, y: -866 }, + { id: 631, label: 'Floyd Axel', radius: 18, x: -171, y: 992 }, + { id: 632, label: 'Charin Castle', radius: 18, x: 682, y: 991 }, + { id: 633, label: "Alexandr O'Clery", radius: 18, x: 900, y: 801 }, + { id: 634, label: 'Roderick Hasselby', radius: 18, x: 501, y: -818 }, + { id: 635, label: 'Megen Pingstone', radius: 18, x: 930, y: -340 }, + { id: 636, label: 'Gavan Bertolaccini', radius: 18, x: 862, y: 496 }, + { id: 637, label: 'Cathrin Awcock', radius: 18, x: 524, y: -868 }, + { id: 638, label: 'Reider Adair', radius: 18, x: 894, y: -411 }, + { id: 639, label: 'Amory Klouz', radius: 18, x: -22, y: -937 }, + { id: 640, label: 'Rustin McGarrahan', radius: 18, x: 861, y: 928 }, + { id: 641, label: 'Zara Vasilyev', radius: 18, x: 826, y: -623 }, + { id: 642, label: 'Ivy Bartolini', radius: 18, x: 831, y: 963 }, + { id: 643, label: 'Donelle Fraczak', radius: 18, x: -222, y: -130 }, + { id: 644, label: 'Catherine Cuseck', radius: 18, x: -74, y: 97 }, + { id: 645, label: 'Hugibert Ferguson', radius: 18, x: 172, y: 99 }, + { id: 646, label: 'Innis Noton', radius: 18, x: 934, y: -209 }, + { id: 647, label: 'Hadley Merton', radius: 18, x: 731, y: 970 }, + { id: 648, label: 'Vivi Fassman', radius: 18, x: -450, y: 91 }, + { id: 649, label: 'Goldi Linstead', radius: 18, x: -415, y: 988 }, + { id: 650, label: 'Mala Hammand', radius: 18, x: -647, y: 123 }, + { id: 651, label: 'Isabel Clouston', radius: 18, x: 541, y: 599 }, + { id: 652, label: 'Sally Dinneen', radius: 18, x: 810, y: 461 }, + { id: 653, label: 'Lynnette Buckney', radius: 18, x: 258, y: -857 }, + { id: 654, label: 'Nicolai Miskelly', radius: 18, x: -544, y: 778 }, + { id: 655, label: 'Daron Lackey', radius: 18, x: -357, y: -844 }, + { id: 656, label: 'Harley Monni', radius: 18, x: -320, y: 111 }, + { id: 657, label: 'Debbi Parren', radius: 18, x: 396, y: 641 }, + { id: 658, label: 'Hyacinthie Bennedick', radius: 18, x: 8, y: -11 }, + { id: 659, label: 'Ange Trench', radius: 18, x: 822, y: 684 }, + { id: 660, label: 'Doris Synder', radius: 18, x: 648, y: 986 }, + { id: 661, label: 'Bonny Serridge', radius: 18, x: -699, y: -408 }, + { id: 662, label: 'Jodie Martensen', radius: 18, x: -743, y: 722 }, + { id: 663, label: 'Sherwynd Larder', radius: 18, x: -700, y: -632 }, + { id: 664, label: 'Datha Wainwright', radius: 18, x: 410, y: -830 }, + { id: 665, label: 'Kellen Jessup', radius: 18, x: -130, y: 566 }, + { id: 666, label: 'Lennard Winspear', radius: 18, x: 593, y: -159 }, + { id: 667, label: 'Ranee Silverlock', radius: 18, x: 662, y: 525 }, + { id: 668, label: 'Ichabod Moulton', radius: 18, x: 116, y: 652 }, + { id: 669, label: 'Monah Clatworthy', radius: 18, x: -669, y: -981 }, + { id: 670, label: 'Marylin Polding', radius: 18, x: -793, y: -165 }, + { id: 671, label: 'Lorenzo Codman', radius: 18, x: 669, y: -561 }, + { id: 672, label: 'Sharla Antognozzii', radius: 18, x: -379, y: 611 }, + { id: 673, label: 'Hunter Pouck', radius: 18, x: 354, y: 482 }, + { id: 674, label: 'Donaugh Stiegars', radius: 18, x: -18, y: -296 }, + { id: 675, label: 'Reeva Aleksidze', radius: 18, x: 531, y: 609 }, + { id: 676, label: 'Ripley Castiglione', radius: 18, x: 786, y: 259 }, + { id: 677, label: 'Valery Morling', radius: 18, x: 727, y: 50 }, + { id: 678, label: 'Rustie Bilbrooke', radius: 18, x: 661, y: -142 }, + { id: 679, label: 'Muriel Minchin', radius: 18, x: 888, y: -758 }, + { id: 680, label: 'Jayme De Simone', radius: 18, x: -384, y: 791 }, + { id: 681, label: 'Hy Pring', radius: 18, x: -314, y: 793 }, + { id: 682, label: 'Gifford Goodsall', radius: 18, x: 891, y: 734 }, + { id: 683, label: 'Alvy MacGiolla Pheadair', radius: 18, x: -457, y: -397 }, + { id: 684, label: 'Coop Pesak', radius: 18, x: 249, y: -156 }, + { id: 685, label: 'Alina Pley', radius: 18, x: 164, y: 352 }, + { id: 686, label: 'Galvan Bosse', radius: 18, x: -196, y: -160 }, + { id: 687, label: 'Lisha Bussel', radius: 18, x: 418, y: 319 }, + { id: 688, label: 'Jacky Bullers', radius: 18, x: 167, y: -68 }, + { id: 689, label: 'Wilie Dash', radius: 18, x: 135, y: -685 }, + { id: 690, label: 'Cissiee Bream', radius: 18, x: -335, y: -599 }, + { id: 691, label: 'Reynolds Jenny', radius: 18, x: -436, y: 136 }, + { id: 692, label: 'Raoul Volante', radius: 18, x: -938, y: -41 }, + { id: 693, label: 'Ondrea Webby', radius: 18, x: 575, y: 249 }, + { id: 694, label: 'Angelika McKie', radius: 18, x: -766, y: 447 }, + { id: 695, label: 'Sigismond Foch', radius: 18, x: 458, y: -678 }, + { id: 696, label: 'Claudio Killingworth', radius: 18, x: 63, y: 669 }, + { id: 697, label: 'Thorndike Clarke', radius: 18, x: -524, y: 130 }, + { id: 698, label: 'Yulma Queree', radius: 18, x: -44, y: -39 }, + { id: 699, label: 'Ford Phipps', radius: 18, x: -449, y: 767 }, + { id: 700, label: 'Emyle Dudny', radius: 18, x: -64, y: -314 }, + { id: 701, label: 'Nathaniel Dickey', radius: 18, x: 931, y: -995 }, + { id: 702, label: 'Rod Tuther', radius: 18, x: 193, y: -193 }, + { id: 703, label: 'Albie Callender', radius: 18, x: -723, y: 946 }, + { id: 704, label: 'Noland Carnalan', radius: 18, x: -917, y: 742 }, + { id: 705, label: "Britta D'Ugo", radius: 18, x: -201, y: 831 }, + { id: 706, label: 'Norry Lamblin', radius: 18, x: -908, y: -24 }, + { id: 707, label: 'Goldina Bennedick', radius: 18, x: -560, y: 371 }, + { id: 708, label: 'Randa Greeno', radius: 18, x: 624, y: 150 }, + { id: 709, label: 'Faulkner Rockhall', radius: 18, x: -332, y: 595 }, + { id: 710, label: 'Royce Lazonby', radius: 18, x: 278, y: -707 }, + { id: 711, label: 'Shepherd Pharaoh', radius: 18, x: -823, y: -621 }, + { id: 712, label: 'Emlen Axcell', radius: 18, x: 671, y: -961 }, + { id: 713, label: 'Starla Fenna', radius: 18, x: 453, y: 536 }, + { id: 714, label: 'Benedikt Shephard', radius: 18, x: -291, y: 115 }, + { id: 715, label: 'Nancey Marquess', radius: 18, x: -197, y: 61 }, + { id: 716, label: 'Rois Inwood', radius: 18, x: -892, y: -193 }, + { id: 717, label: 'Shawna Mateja', radius: 18, x: 114, y: 572 }, + { id: 718, label: 'Urbain Lowre', radius: 18, x: -266, y: -449 }, + { id: 719, label: 'Kerry Berger', radius: 18, x: 315, y: -440 }, + { id: 720, label: 'Brockie Farnaby', radius: 18, x: -503, y: 8 }, + { id: 721, label: 'Arlyn Cleife', radius: 18, x: 899, y: -989 }, + { id: 722, label: 'Tamarah Gallehock', radius: 18, x: 870, y: -715 }, + { id: 723, label: 'Reynold MacAndie', radius: 18, x: 132, y: -744 }, + { id: 724, label: 'Theo Allcoat', radius: 18, x: -209, y: 518 }, + { id: 725, label: 'Caroljean Dennis', radius: 18, x: -464, y: -241 }, + { id: 726, label: 'Gilles Tippell', radius: 18, x: 109, y: -808 }, + { id: 727, label: 'Rafaelia Yushkin', radius: 18, x: 772, y: 225 }, + { id: 728, label: 'Terrijo Larsen', radius: 18, x: 269, y: -669 }, + { id: 729, label: 'Ange Millthorpe', radius: 18, x: 74, y: 230 }, + { id: 730, label: 'Anissa Maystone', radius: 18, x: 533, y: -667 }, + { id: 731, label: 'Wallie Ponceford', radius: 18, x: -770, y: 81 }, + { id: 732, label: 'Marlyn Coates', radius: 18, x: -424, y: 244 }, + { id: 733, label: 'Grace Mac Giolla Pheadair', radius: 18, x: 785, y: -211 }, + { id: 734, label: 'Benedicto Dyble', radius: 18, x: 179, y: -254 }, + { id: 735, label: 'Barnett Jendrach', radius: 18, x: -491, y: 514 }, + { id: 736, label: 'Daffie Simo', radius: 18, x: 816, y: 747 }, + { id: 737, label: 'Mahalia Napper', radius: 18, x: 766, y: 279 }, + { id: 738, label: 'Ronda Rosenblath', radius: 18, x: 479, y: 560 }, + { id: 739, label: 'Fonsie Scrannage', radius: 18, x: 972, y: 328 }, + { id: 740, label: 'Cristin Skelhorn', radius: 18, x: -689, y: -981 }, + { id: 741, label: 'Eb Hibling', radius: 18, x: -840, y: -915 }, + { id: 742, label: 'Anstice Brian', radius: 18, x: -787, y: 844 }, + { id: 743, label: 'Dalli Booth', radius: 18, x: -517, y: -289 }, + { id: 744, label: 'Darla Levington', radius: 18, x: -368, y: 125 }, + { id: 745, label: 'Ruy Noirel', radius: 18, x: 955, y: -836 }, + { id: 746, label: 'Korie Bradborne', radius: 18, x: -722, y: -334 }, + { id: 747, label: 'Marketa Sherrin', radius: 18, x: 706, y: 905 }, + { id: 748, label: 'Pennie Dealy', radius: 18, x: 389, y: -80 }, + { id: 749, label: 'Madel Aime', radius: 18, x: -985, y: -54 }, + { id: 750, label: 'Barthel Hulatt', radius: 18, x: 960, y: -745 }, + { id: 751, label: 'Alix Stradling', radius: 18, x: 140, y: 747 }, + { id: 752, label: 'Jordon Hodgins', radius: 18, x: 946, y: -284 }, + { id: 753, label: 'Marabel MacIlriach', radius: 18, x: -928, y: -421 }, + { id: 754, label: 'Darrel Karolyi', radius: 18, x: 525, y: 870 }, + { id: 755, label: 'Maximilien Pharrow', radius: 18, x: -264, y: 462 }, + { id: 756, label: 'Esme Skellon', radius: 18, x: 593, y: -810 }, + { id: 757, label: 'Lindsay de Courcy', radius: 18, x: 212, y: -132 }, + { id: 758, label: 'Boyce Bonavia', radius: 18, x: 932, y: -475 }, + { id: 759, label: 'Dyanne Bromby', radius: 18, x: -561, y: -925 }, + { id: 760, label: 'Carol-jean Fuente', radius: 18, x: 470, y: -809 }, + { id: 761, label: 'Vania Marciek', radius: 18, x: 618, y: -254 }, + { id: 762, label: 'Guntar Klain', radius: 18, x: 482, y: 239 }, + { id: 763, label: 'Millicent Calafate', radius: 18, x: -16, y: -241 }, + { id: 764, label: 'Gracia Levene', radius: 18, x: 475, y: -351 }, + { id: 765, label: 'Aguie Jowitt', radius: 18, x: 15, y: 614 }, + { id: 766, label: 'Cinda Hadye', radius: 18, x: 242, y: -386 }, + { id: 767, label: 'Opaline Jarred', radius: 18, x: -367, y: 807 }, + { id: 768, label: 'Keslie Devonish', radius: 18, x: -336, y: 181 }, + { id: 769, label: 'Kristoffer McClarence', radius: 18, x: -804, y: -163 }, + { id: 770, label: 'Roman Ravenshaw', radius: 18, x: -723, y: -825 }, + { id: 771, label: 'Maire Labbati', radius: 18, x: -237, y: -524 }, + { id: 772, label: 'Wally Loade', radius: 18, x: 547, y: -337 }, + { id: 773, label: 'Launce Bakster', radius: 18, x: 861, y: 822 }, + { id: 774, label: 'Peta Bonus', radius: 18, x: 59, y: 553 }, + { id: 775, label: 'Kent Moring', radius: 18, x: -121, y: -409 }, + { id: 776, label: 'Ellswerth Sergant', radius: 18, x: -427, y: 798 }, + { id: 777, label: 'Nanette Millions', radius: 18, x: 434, y: 353 }, + { id: 778, label: 'Kayla Hackey', radius: 18, x: -298, y: -477 }, + { id: 779, label: 'Caye Schistl', radius: 18, x: 226, y: 255 }, + { id: 780, label: 'Hazel Haxbie', radius: 18, x: -751, y: -543 }, + { id: 781, label: 'Berke Pfeiffer', radius: 18, x: 58, y: -203 }, + { id: 782, label: 'Frannie Haselup', radius: 18, x: -342, y: 848 }, + { id: 783, label: 'Trumaine Drakeley', radius: 18, x: 658, y: -786 }, + { id: 784, label: 'Brewster Lorking', radius: 18, x: -50, y: -734 }, + { id: 785, label: 'Ronalda Gebuhr', radius: 18, x: -704, y: 955 }, + { id: 786, label: 'Nikolia Poulter', radius: 18, x: 596, y: -126 }, + { id: 787, label: 'Madeleine Wattinham', radius: 18, x: 826, y: 730 }, + { id: 788, label: 'Cornall Chuter', radius: 18, x: 47, y: -465 }, + { id: 789, label: 'Tibold Lescop', radius: 18, x: -486, y: -387 }, + { id: 790, label: 'Ive Marvelley', radius: 18, x: 961, y: -278 }, + { id: 791, label: 'Zenia Penhalewick', radius: 18, x: -735, y: -812 }, + { id: 792, label: 'Wynnie Matiasek', radius: 18, x: 691, y: -566 }, + { id: 793, label: 'Delainey McGibbon', radius: 18, x: 54, y: 291 }, + { id: 794, label: 'Petronella Kaplan', radius: 18, x: 990, y: 398 }, + { id: 795, label: 'Shoshanna Troughton', radius: 18, x: 533, y: -853 }, + { id: 796, label: 'Chalmers Moscon', radius: 18, x: 557, y: 503 }, + { id: 797, label: 'Stavro Matousek', radius: 18, x: -252, y: -447 }, + { id: 798, label: 'Othelia Dickey', radius: 18, x: -420, y: -579 }, + { id: 799, label: 'Lowrance Gilfillan', radius: 18, x: 263, y: -907 }, + { id: 800, label: 'Aurthur Fullalove', radius: 18, x: 536, y: 337 }, + { id: 801, label: 'Ariel Ivanyukov', radius: 18, x: -791, y: -729 }, + { id: 802, label: 'Eustacia Sproat', radius: 18, x: 283, y: -197 }, + { id: 803, label: 'Tamar Gylle', radius: 18, x: -609, y: 979 }, + { id: 804, label: 'Sebastien Scopes', radius: 18, x: -864, y: 76 }, + { id: 805, label: 'Mylo Shellard', radius: 18, x: 200, y: -326 }, + { id: 806, label: 'Rolf Blasdale', radius: 18, x: -461, y: -628 }, + { id: 807, label: 'Cordy Byrth', radius: 18, x: 224, y: 963 }, + { id: 808, label: 'Isabella MacAne', radius: 18, x: 56, y: -480 }, + { id: 809, label: 'Izzy Comini', radius: 18, x: 71, y: 599 }, + { id: 810, label: 'Isabelita Kynsey', radius: 18, x: -294, y: -305 }, + { id: 811, label: 'Gabbi Raynor', radius: 18, x: -519, y: 369 }, + { id: 812, label: 'Evanne Ruske', radius: 18, x: -366, y: -80 }, + { id: 813, label: 'Bartolomeo Founds', radius: 18, x: 764, y: 807 }, + { id: 814, label: 'Otha Milner', radius: 18, x: 848, y: 418 }, + { id: 815, label: "Bronny D'Agostino", radius: 18, x: -612, y: -109 }, + { id: 816, label: 'Dyane Amerighi', radius: 18, x: -368, y: 993 }, + { id: 817, label: 'Juliet Ryles', radius: 18, x: 947, y: -999 }, + { id: 818, label: 'Carey Melbourn', radius: 18, x: -299, y: -196 }, + { id: 819, label: 'Dar Lorman', radius: 18, x: -169, y: 363 }, + { id: 820, label: 'Shane Claque', radius: 18, x: -791, y: -963 }, + { id: 821, label: 'Thaddus Goodale', radius: 18, x: -108, y: 56 }, + { id: 822, label: 'Zaneta Phibb', radius: 18, x: 877, y: -629 }, + { id: 823, label: 'Karoly Korneichik', radius: 18, x: 721, y: 649 }, + { id: 824, label: 'Gweneth Audritt', radius: 18, x: -390, y: 48 }, + { id: 825, label: 'Catlee Bampforth', radius: 18, x: -764, y: -666 }, + { id: 826, label: 'Base Kirlin', radius: 18, x: -156, y: -194 }, + { id: 827, label: 'Raeann Lyptrit', radius: 18, x: 995, y: 152 }, + { id: 828, label: 'Jozef Mattielli', radius: 18, x: 74, y: -430 }, + { id: 829, label: 'Hagan Tombleson', radius: 18, x: 190, y: -43 }, + { id: 830, label: 'Dilan Powner', radius: 18, x: 850, y: -272 }, + { id: 831, label: 'Svend Nusche', radius: 18, x: -118, y: -544 }, + { id: 832, label: 'Peggie Glassford', radius: 18, x: 403, y: 517 }, + { id: 833, label: 'Gertie Cobb', radius: 18, x: 198, y: 253 }, + { id: 834, label: 'Hamnet Zelley', radius: 18, x: 784, y: 205 }, + { id: 835, label: 'Legra Tidey', radius: 18, x: 758, y: -528 }, + { id: 836, label: 'Hilde Simony', radius: 18, x: -339, y: -896 }, + { id: 837, label: 'Salomone Anyon', radius: 18, x: -116, y: 485 }, + { id: 838, label: 'Betteann Panchen', radius: 18, x: 423, y: -854 }, + { id: 839, label: 'Drona Arnaez', radius: 18, x: 497, y: -195 }, + { id: 840, label: 'Ally Cato', radius: 18, x: 92, y: 439 }, + { id: 841, label: 'Carmen Renzini', radius: 18, x: -71, y: -958 }, + { id: 842, label: 'Mia Gasken', radius: 18, x: 0, y: -532 }, + { id: 843, label: 'Robin Simao', radius: 18, x: -99, y: -634 }, + { id: 844, label: 'Ulises Torbet', radius: 18, x: -297, y: -360 }, + { id: 845, label: 'Kippy Eddowis', radius: 18, x: -868, y: -111 }, + { id: 846, label: 'Beulah Poynton', radius: 18, x: 99, y: -245 }, + { id: 847, label: 'Astrid Thying', radius: 18, x: 556, y: 101 }, + { id: 848, label: 'Koenraad Fillon', radius: 18, x: 739, y: -440 }, + { id: 849, label: 'Germaine Merida', radius: 18, x: -799, y: -276 }, + { id: 850, label: 'Bernadette Otham', radius: 18, x: -608, y: -827 }, + { id: 851, label: 'Filmer McCombe', radius: 18, x: -722, y: -841 }, + { id: 852, label: 'Sharlene Dusting', radius: 18, x: -984, y: -658 }, + { id: 853, label: 'Portia Aaronson', radius: 18, x: -930, y: 85 }, + { id: 854, label: 'Ediva Byars', radius: 18, x: 352, y: 313 }, + { id: 855, label: 'Moyna Burkart', radius: 18, x: 142, y: -675 }, + { id: 856, label: 'Huberto Smalman', radius: 18, x: 559, y: -798 }, + { id: 857, label: 'Alano Woolfenden', radius: 18, x: -287, y: 721 }, + { id: 858, label: 'Annmaria Exroll', radius: 18, x: 962, y: -62 }, + { id: 859, label: 'Noreen McGuiness', radius: 18, x: -627, y: 397 }, + { id: 860, label: 'Emelita Basketfield', radius: 18, x: 33, y: -307 }, + { id: 861, label: 'Shurwood Reignolds', radius: 18, x: 375, y: 883 }, + { id: 862, label: 'Roxane Awdry', radius: 18, x: 201, y: 879 }, + { id: 863, label: 'Holly Gornar', radius: 18, x: -492, y: 677 }, + { id: 864, label: 'Ashlin Mathelin', radius: 18, x: -623, y: 321 }, + { id: 865, label: 'Ancell Wasiel', radius: 18, x: -86, y: -862 }, + { id: 866, label: 'Fanya Mendez', radius: 18, x: -653, y: -927 }, + { id: 867, label: 'Bab Naylor', radius: 18, x: 258, y: -326 }, + { id: 868, label: 'Hadrian Denisyuk', radius: 18, x: -385, y: -809 }, + { id: 869, label: 'Muffin Crut', radius: 18, x: 203, y: -360 }, + { id: 870, label: 'Beryl Dummett', radius: 18, x: 610, y: 99 }, + { id: 871, label: 'Amalea Sherborn', radius: 18, x: 429, y: 525 }, + { id: 872, label: 'Marley Brumhead', radius: 18, x: -667, y: 715 }, + { id: 873, label: 'Faina Ludl', radius: 18, x: 412, y: -954 }, + { id: 874, label: "Ody O'Hartnett", radius: 18, x: 105, y: 369 }, + { id: 875, label: 'Milena Jackett', radius: 18, x: 239, y: -85 }, + { id: 876, label: 'Kirk Gann', radius: 18, x: 340, y: -970 }, + { id: 877, label: 'Amanda Dobbs', radius: 18, x: -107, y: -110 }, + { id: 878, label: 'Lemar Plose', radius: 18, x: 128, y: -835 }, + { id: 879, label: 'Jervis Lainge', radius: 18, x: -592, y: 344 }, + { id: 880, label: 'Nana Shuttlewood', radius: 18, x: -566, y: -467 }, + { id: 881, label: 'Calla Bubb', radius: 18, x: 529, y: 86 }, + { id: 882, label: 'Iorgo Muzzall', radius: 18, x: -544, y: 709 }, + { id: 883, label: 'Adore Covelle', radius: 18, x: 717, y: 400 }, + { id: 884, label: 'Paulita Busch', radius: 18, x: -117, y: 616 }, + { id: 885, label: 'Bambie Wolfendale', radius: 18, x: -17, y: -627 }, + { id: 886, label: 'Katti Burriss', radius: 18, x: 970, y: 950 }, + { id: 887, label: 'Gaelan Cridlin', radius: 18, x: -52, y: -569 }, + { id: 888, label: 'Hannah Poon', radius: 18, x: 932, y: -717 }, + { id: 889, label: 'Annaliese Noblet', radius: 18, x: -947, y: -107 }, + { id: 890, label: 'Meir Radeliffe', radius: 18, x: -266, y: 297 }, + { id: 891, label: 'Rhianna Jeger', radius: 18, x: 710, y: -725 }, + { id: 892, label: 'Noach Otson', radius: 18, x: -472, y: -438 }, + { id: 893, label: 'Salim Daid', radius: 18, x: -844, y: -376 }, + { id: 894, label: 'Catriona Domengue', radius: 18, x: 162, y: -731 }, + { id: 895, label: 'Leticia Meegan', radius: 18, x: -944, y: -420 }, + { id: 896, label: 'Brose Pickering', radius: 18, x: -485, y: 824 }, + { id: 897, label: 'Shelton Kilfeder', radius: 18, x: -239, y: 132 }, + { id: 898, label: 'See Klug', radius: 18, x: -463, y: 914 }, + { id: 899, label: 'Lana Prickett', radius: 18, x: -642, y: 950 }, + { id: 900, label: 'Odele Quiney', radius: 18, x: -722, y: -914 }, + { id: 901, label: 'Cad Fielding', radius: 18, x: 868, y: -360 }, + { id: 902, label: 'Ninette Cobello', radius: 18, x: -644, y: -756 }, + { id: 903, label: 'Lizabeth Guinness', radius: 18, x: 452, y: -902 }, + { id: 904, label: 'Pip Schwandt', radius: 18, x: -373, y: -874 }, + { id: 905, label: 'Homerus Treversh', radius: 18, x: -728, y: -613 }, + { id: 906, label: 'Althea Vautier', radius: 18, x: 532, y: 733 }, + { id: 907, label: 'Chilton Hanscomb', radius: 18, x: -639, y: -274 }, + { id: 908, label: 'Winne Barca', radius: 18, x: -506, y: -74 }, + { id: 909, label: 'Tish Coltart', radius: 18, x: 899, y: 690 }, + { id: 910, label: 'Vlad McLucas', radius: 18, x: 653, y: 437 }, + { id: 911, label: 'Joaquin Trebbett', radius: 18, x: 927, y: 738 }, + { id: 912, label: 'Tonya Potzold', radius: 18, x: -937, y: -352 }, + { id: 913, label: 'Gerti Standeven', radius: 18, x: -236, y: -844 }, + { id: 914, label: 'Bertina Breitling', radius: 18, x: -448, y: -715 }, + { id: 915, label: 'Frederigo Strevens', radius: 18, x: -3, y: -430 }, + { id: 916, label: 'Findlay Gashion', radius: 18, x: -66, y: -210 }, + { id: 917, label: 'Marie Fealty', radius: 18, x: 104, y: -693 }, + { id: 918, label: 'Ronna McAneny', radius: 18, x: -293, y: 575 }, + { id: 919, label: 'Matilde Snare', radius: 18, x: 860, y: -132 }, + { id: 920, label: 'Uta Bierling', radius: 18, x: -407, y: -537 }, + { id: 921, label: 'Malina Lynds', radius: 18, x: -157, y: 702 }, + { id: 922, label: 'Garrik Reggler', radius: 18, x: -946, y: 526 }, + { id: 923, label: 'Elmore Kelwick', radius: 18, x: -685, y: 505 }, + { id: 924, label: 'Caddric Gorges', radius: 18, x: 694, y: 394 }, + { id: 925, label: 'Wendie Rapinett', radius: 18, x: -764, y: -160 }, + { id: 926, label: 'Sharon Chill', radius: 18, x: 327, y: 961 }, + { id: 927, label: 'Alexia Tebbut', radius: 18, x: 942, y: -430 }, + { id: 928, label: 'Keefer Perulli', radius: 18, x: 634, y: 597 }, + { id: 929, label: 'Juliet Thoms', radius: 18, x: 581, y: -99 }, + { id: 930, label: 'Cheryl Legerton', radius: 18, x: -963, y: -283 }, + { id: 931, label: 'Cortney Demanche', radius: 18, x: 382, y: 304 }, + { id: 932, label: 'Carlita Lyston', radius: 18, x: -549, y: -191 }, + { id: 933, label: 'Fidela Schiersch', radius: 18, x: -941, y: 71 }, + { id: 934, label: 'Toddy Lampett', radius: 18, x: 325, y: -491 }, + { id: 935, label: 'Maura Thorburn', radius: 18, x: 14, y: -552 }, + { id: 936, label: 'Angel Gerran', radius: 18, x: -109, y: -628 }, + { id: 937, label: 'Guillermo Dempster', radius: 18, x: -331, y: -627 }, + { id: 938, label: 'Gearard Donnersberg', radius: 18, x: 667, y: -771 }, + { id: 939, label: "Harold O'Keenan", radius: 18, x: 938, y: -858 }, + { id: 940, label: 'Von Sisselot', radius: 18, x: 279, y: 189 }, + { id: 941, label: 'Violante Corradino', radius: 18, x: 59, y: 702 }, + { id: 942, label: 'Colly Borrel', radius: 18, x: 915, y: -296 }, + { id: 943, label: 'Rozalie Oager', radius: 18, x: -106, y: 336 }, + { id: 944, label: 'Wilburt Berrow', radius: 18, x: -608, y: 839 }, + { id: 945, label: 'Riva Schneidau', radius: 18, x: -81, y: 146 }, + { id: 946, label: 'Angelico Berford', radius: 18, x: -843, y: 368 }, + { id: 947, label: 'Clerkclaude Gun', radius: 18, x: 707, y: -784 }, + { id: 948, label: 'Corette Lauder', radius: 18, x: 719, y: -546 }, + { id: 949, label: 'Blythe Ivetts', radius: 18, x: -330, y: -284 }, + { id: 950, label: 'Aurlie Beiderbecke', radius: 18, x: 899, y: -790 }, + { id: 951, label: 'Hanna Dripp', radius: 18, x: -609, y: -855 }, + { id: 952, label: 'Cyrillus Gason', radius: 18, x: 62, y: 778 }, + { id: 953, label: 'Herbert Ivakhin', radius: 18, x: 909, y: 753 }, + { id: 954, label: 'Jerrylee Slayton', radius: 18, x: -600, y: -799 }, + { id: 955, label: 'Warner Missington', radius: 18, x: 40, y: -307 }, + { id: 956, label: 'Holli Syer', radius: 18, x: 718, y: -14 }, + { id: 957, label: 'Averell Devil', radius: 18, x: -830, y: -838 }, + { id: 958, label: 'Sonja Gyves', radius: 18, x: 899, y: 586 }, + { id: 959, label: 'Rosina Rentz', radius: 18, x: 144, y: 408 }, + { id: 960, label: 'Katherina Trendle', radius: 18, x: 702, y: 532 }, + { id: 961, label: 'Linet Benoey', radius: 18, x: -725, y: -120 }, + { id: 962, label: 'Rowney Arrighi', radius: 18, x: -67, y: -894 }, + { id: 963, label: 'Mona Paulitschke', radius: 18, x: -35, y: 144 }, + { id: 964, label: 'Tymothy Goomes', radius: 18, x: -492, y: 923 }, + { id: 965, label: 'Bernard Crabtree', radius: 18, x: 398, y: 942 }, + { id: 966, label: 'Farrell Conti', radius: 18, x: -48, y: 920 }, + { id: 967, label: 'Matty Gillum', radius: 18, x: -663, y: -232 }, + { id: 968, label: 'Terri Fowlds', radius: 18, x: 837, y: -551 }, + { id: 969, label: 'Sargent Elsey', radius: 18, x: 209, y: -145 }, + { id: 970, label: 'Eunice Ebdin', radius: 18, x: 563, y: -840 }, + { id: 971, label: 'Rafa Bohan', radius: 18, x: 1000, y: 359 }, + { id: 972, label: 'Richmond Sumsion', radius: 18, x: -476, y: 455 }, + { id: 973, label: 'Cristie Elnough', radius: 18, x: -787, y: -984 }, + { id: 974, label: 'Doralin Bickle', radius: 18, x: -856, y: 836 }, + { id: 975, label: 'Lynnea Seebert', radius: 18, x: 842, y: -805 }, + { id: 976, label: 'Prince Blakeslee', radius: 18, x: 859, y: 387 }, + { id: 977, label: 'Elyse Colly', radius: 18, x: -68, y: -62 }, + { id: 978, label: 'Hailee Fitton', radius: 18, x: -476, y: 588 }, + { id: 979, label: 'Seward McKeaveney', radius: 18, x: -553, y: 127 }, + { id: 980, label: 'Mateo Nerney', radius: 18, x: -192, y: 306 }, + { id: 981, label: 'Ellsworth McLaren', radius: 18, x: -489, y: -121 }, + { id: 982, label: 'Nevil Gitsham', radius: 18, x: -269, y: 920 }, + { id: 983, label: 'Bret Purchase', radius: 18, x: 848, y: 558 }, + { id: 984, label: 'Marve Pendleton', radius: 18, x: 943, y: 304 }, + { id: 985, label: 'Hanna Malim', radius: 18, x: 302, y: 799 }, + { id: 986, label: 'Marcia Strete', radius: 18, x: 203, y: 156 }, + { id: 987, label: 'Bill Rohan', radius: 18, x: 798, y: -347 }, + { id: 988, label: 'Gustav Yewdale', radius: 18, x: -545, y: 137 }, + { id: 989, label: 'Orville Willerstone', radius: 18, x: -624, y: 78 }, + { id: 990, label: 'Elnore Wichard', radius: 18, x: 28, y: -139 }, + { id: 991, label: 'Dru Eatock', radius: 18, x: 567, y: -308 }, + { id: 992, label: 'Dion Sydall', radius: 18, x: 324, y: -22 }, + { id: 993, label: 'Giffer Traill', radius: 18, x: 239, y: -899 }, + { id: 994, label: 'Garrett Arndt', radius: 18, x: 431, y: 94 }, + { id: 995, label: 'Jere Darrington', radius: 18, x: -521, y: 191 }, + { id: 996, label: 'Nehemiah Jorg', radius: 18, x: -550, y: -252 }, + { id: 997, label: 'Alyce Blanket', radius: 18, x: 834, y: -847 }, + { id: 998, label: 'Valeda Gulston', radius: 18, x: 697, y: 299 }, + { id: 999, label: 'Davy Commander', radius: 18, x: -872, y: -103 }, + { id: 1000, label: 'Phylys Kinver', radius: 18, x: 244, y: -864 } +] diff --git a/tests/tsconfig.json b/tests/tsconfig.json new file mode 100644 index 00000000..42c0029a --- /dev/null +++ b/tests/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "../tsconfig.json", + "include": ["**/*"], + "compilerOptions": { + "types": ["vitest/globals"], + "target": "ES2015", + "module": "ESNext", + "lib": ["ES2015", "ES2017", "DOM"] + } +} diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 00000000..6bf323f9 --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,11 @@ +/// +/// + +import { defineConfig } from 'vite' + +export default defineConfig({ + test: { + globals: true, + environment: 'happy-dom' + } +}) From f4fa23cf209e456fe4e271fba2d742ba684cc4f2 Mon Sep 17 00:00:00 2001 From: Mikey Gower Date: Tue, 19 Sep 2023 15:40:59 -0400 Subject: [PATCH 12/22] fix merge conflicts --- src/layout/hierarchy/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/layout/hierarchy/index.ts b/src/layout/hierarchy/index.ts index 3503e2d0..c2d7abc6 100644 --- a/src/layout/hierarchy/index.ts +++ b/src/layout/hierarchy/index.ts @@ -68,10 +68,10 @@ export const Layout = () => { return { ...node, y: x, x: y } case 'right': // rotate tree 90 degrees and flip on x axis by offsetting with tree width - return { ...node, y: x, x: root.height * nodeSize[1] - y } + return { ...node, y: x, x: hierarchy.height * nodeSize[1] - y } case 'bottom': // flip on y axis by offsetting with tree height - return { ...node, x, y: root.height * nodeSize[0] - y } + return { ...node, x, y: hierarchy.height * nodeSize[0] - y } default: // default to top return { ...node, x, y } From 1a0d4b5aed80c37d3391f63e3f2d984e96366816 Mon Sep 17 00:00:00 2001 From: Mikey Gower Date: Tue, 19 Sep 2023 15:57:32 -0400 Subject: [PATCH 13/22] add sorting to examples --- examples/hierarchy/data.ts | 3404 ----------------------------------- examples/hierarchy/index.ts | 24 +- 2 files changed, 20 insertions(+), 3408 deletions(-) delete mode 100644 examples/hierarchy/data.ts diff --git a/examples/hierarchy/data.ts b/examples/hierarchy/data.ts deleted file mode 100644 index 737aabc4..00000000 --- a/examples/hierarchy/data.ts +++ /dev/null @@ -1,3404 +0,0 @@ -export default [ - { - source: 'i1D5ub-15RRb0Omyik4LMQ', - source_type: 'company', - source_label: 'POUCHEN VIETNAM ENTERPRISE .LTD', - target: '875yxpVvxV2RsweKMRiu7g', - target_type: 'company', - target_label: 'NIKE USA, INC.', - field: 'ships_to' - }, - { - source: 'ghSsFkTP63LNCtklRVteUA', - source_type: 'company', - source_label: 'Công Ty TNHH Đông Tây Tây Nguyên', - target: 'i1D5ub-15RRb0Omyik4LMQ', - target_type: 'company', - target_label: 'POUCHEN VIETNAM ENTERPRISE .LTD', - field: 'ships_to' - }, - { - source: 'JBs_ElZzH-PQIG8Sm3fBaQ', - source_type: 'person', - source_label: 'CONG TY CHANG SHIN VIET NAM TRACH NHIEM HUU HAN', - target: 'ghSsFkTP63LNCtklRVteUA', - target_type: 'company', - target_label: 'Công Ty TNHH Đông Tây Tây Nguyên', - field: 'ships_to' - }, - { - source: 'y4qWGNbfS4u6qB0a_Ztx0w', - source_type: 'company', - source_label: 'CôNG TY TNHH SAMBU FINE VIệT NAM', - target: 'i1D5ub-15RRb0Omyik4LMQ', - target_type: 'company', - target_label: 'POUCHEN VIETNAM ENTERPRISE .LTD', - field: 'ships_to' - }, - { - source: '-g7pbHTY4DWohGGDPGHlSg', - source_type: 'company', - source_label: 'TECHNICK PRODUCTS INC', - target: 'y4qWGNbfS4u6qB0a_Ztx0w', - target_type: 'company', - target_label: 'CôNG TY TNHH SAMBU FINE VIệT NAM', - field: 'ships_to' - }, - { - source: 'POJMUJZTx3tRdR64UUiJJg', - source_type: 'company', - source_label: 'SUNKIST CHEMICAL MACHINERY LTD', - target: 'y4qWGNbfS4u6qB0a_Ztx0w', - target_type: 'company', - target_label: 'CôNG TY TNHH SAMBU FINE VIệT NAM', - field: 'ships_to' - }, - { - source: 'JdWlfTGPr2V9qR8KcTzpqg', - source_type: 'company', - source_label: 'GTM-KOREA', - target: 'y4qWGNbfS4u6qB0a_Ztx0w', - target_type: 'company', - target_label: 'CôNG TY TNHH SAMBU FINE VIệT NAM', - field: 'ships_to' - }, - { - source: '1psWQQT8trJieu_8LaJ1oQ', - source_type: 'company', - source_label: 'NINGBO YONGTAM INTERNATIONAL TRADE CO.,LTD', - target: 'y4qWGNbfS4u6qB0a_Ztx0w', - target_type: 'company', - target_label: 'CôNG TY TNHH SAMBU FINE VIệT NAM', - field: 'ships_to' - }, - { - source: 'PMS7vApODXt0LukTgFeLdg', - source_type: 'company', - source_label: 'CôNG TY TNHH MAXPORT LIMITED (VIET NAM)', - target: '875yxpVvxV2RsweKMRiu7g', - target_type: 'company', - target_label: 'NIKE USA, INC.', - field: 'ships_to' - }, - { - source: '23vQxJdeBrvwq5UgIHOnPw', - source_type: 'company', - source_label: 'ARCTERYX EQUIPMENT', - target: 'PMS7vApODXt0LukTgFeLdg', - target_type: 'company', - target_label: 'CôNG TY TNHH MAXPORT LIMITED (VIET NAM)', - field: 'ships_to' - }, - { - source: 'KiRkgkNcc1g8_tvQ3q-gPQ', - source_type: 'company', - source_label: 'MOL CONSOLIDATION SERVICES FOR AND NYG (VIETNAM) CO.,LTD', - target: '23vQxJdeBrvwq5UgIHOnPw', - target_type: 'company', - target_label: 'ARCTERYX EQUIPMENT', - field: 'ships_to' - }, - { - source: 'Be1vdQekKL83u9Aq_rEWFw', - source_type: 'company', - source_label: 'ECLAT TEXTILE CO., LTD', - target: 'PMS7vApODXt0LukTgFeLdg', - target_type: 'company', - target_label: 'CôNG TY TNHH MAXPORT LIMITED (VIET NAM)', - field: 'ships_to' - }, - { - source: 'R1DOkA8k_SslHRr7d-rW3A', - source_type: 'company', - source_label: 'CôNG TY TRáCH NHIệM HữU HạN THế HUY', - target: 'Be1vdQekKL83u9Aq_rEWFw', - target_type: 'company', - target_label: 'ECLAT TEXTILE CO., LTD', - field: 'ships_to' - }, - { - source: 'aCy376RD81eZW0kjva_hlA', - source_type: 'company', - source_label: 'ASICS EUROPE BV', - target: 'PMS7vApODXt0LukTgFeLdg', - target_type: 'company', - target_label: 'CôNG TY TNHH MAXPORT LIMITED (VIET NAM)', - field: 'ships_to' - }, - { - source: 'BQy4ZlQ4Ba_yxU6EeoR98w', - source_type: 'company', - source_label: 'APL LOGISTICS CO LTD VIETNAM - HAIPH', - target: 'aCy376RD81eZW0kjva_hlA', - target_type: 'company', - target_label: 'ASICS EUROPE BV', - field: 'ships_to' - }, - { - source: '8WWpvOzf3kfMcBDXnM9n6g', - source_type: 'company', - source_label: 'APL LOGISTICS VIETNAM CO LTD', - target: 'aCy376RD81eZW0kjva_hlA', - target_type: 'company', - target_label: 'ASICS EUROPE BV', - field: 'ships_to' - }, - { - source: 'gnj8PTONC4yEeG-OCRHluA', - source_type: 'company', - source_label: 'PT. CHANGSHIN REKSA JAYA', - target: '875yxpVvxV2RsweKMRiu7g', - target_type: 'company', - target_label: 'NIKE USA, INC.', - field: 'ships_to' - }, - { - source: 'dPiJDJTIuGz9yhg4PDWIrg', - source_type: 'company', - source_label: 'Công Ty TNHH Chang Yang Việt Nam', - target: 'gnj8PTONC4yEeG-OCRHluA', - target_type: 'company', - target_label: 'PT. CHANGSHIN REKSA JAYA', - field: 'ships_to' - }, - { - source: 'klHscKfwfgOTEWSG3YC-ig', - source_type: 'company', - source_label: 'EVER BRAVE DEVELOPMENTS LTD TAIWAN BRANCH/ECLIPSE POLYMERS (HK) CO LTD', - target: 'dPiJDJTIuGz9yhg4PDWIrg', - target_type: 'company', - target_label: 'Công Ty TNHH Chang Yang Việt Nam', - field: 'ships_to' - }, - { - source: 'cvCrEjCivX7bNFgIR9-1EA', - source_type: 'company', - source_label: 'COMPUNIC ELECTRONICS CO., LTD.', - target: 'dPiJDJTIuGz9yhg4PDWIrg', - target_type: 'company', - target_label: 'Công Ty TNHH Chang Yang Việt Nam', - field: 'ships_to' - }, - { - source: 'QLeRj9ePjQVmikelvTOMwQ', - source_type: 'company', - source_label: 'LASTING POWER TRADING CO', - target: 'dPiJDJTIuGz9yhg4PDWIrg', - target_type: 'company', - target_label: 'Công Ty TNHH Chang Yang Việt Nam', - field: 'ships_to' - }, - { - source: '5hhhiPzZlqJSJ5BXco5wXA', - source_type: 'company', - source_label: 'MITSUBISHI CORPORATION (HONG KONG) LTD.', - target: 'dPiJDJTIuGz9yhg4PDWIrg', - target_type: 'company', - target_label: 'Công Ty TNHH Chang Yang Việt Nam', - field: 'ships_to' - }, - { - source: 'EkXfcRt7vCjrvBfUoksPkg', - source_type: 'company', - source_label: 'AIMEX INTERNATIONAL TRADING CO LTD', - target: 'dPiJDJTIuGz9yhg4PDWIrg', - target_type: 'company', - target_label: 'Công Ty TNHH Chang Yang Việt Nam', - field: 'ships_to' - }, - { - source: 'H3-64kgougl4rEF6_7J7rw', - source_type: 'company', - source_label: 'QATAR CHEMICAL AND PETROCHEMICAL MARKETING AND DISTRIBUTION (*)', - target: 'dPiJDJTIuGz9yhg4PDWIrg', - target_type: 'company', - target_label: 'Công Ty TNHH Chang Yang Việt Nam', - field: 'ships_to' - }, - { - source: 'E2EZ5I_h_TGoOxlfv9hAjw', - source_type: 'company', - source_label: 'SHUENN JAAN MACHINERY CO., LTD', - target: 'dPiJDJTIuGz9yhg4PDWIrg', - target_type: 'company', - target_label: 'Công Ty TNHH Chang Yang Việt Nam', - field: 'ships_to' - }, - { - source: '9hKkoEBuH6X7cHOPRzE3GQ', - source_type: 'company', - source_label: 'REN FENG LIMITED', - target: 'dPiJDJTIuGz9yhg4PDWIrg', - target_type: 'company', - target_label: 'Công Ty TNHH Chang Yang Việt Nam', - field: 'ships_to' - }, - { - source: 'm6aPsiZTOBdY4WfkNH-BHg', - source_type: 'company', - source_label: 'YULS HK INDUSTRIAL LIMITED', - target: 'dPiJDJTIuGz9yhg4PDWIrg', - target_type: 'company', - target_label: 'Công Ty TNHH Chang Yang Việt Nam', - field: 'ships_to' - }, - { - source: 'cQacKDxiKDfEz9ccVhvNzw', - source_type: 'company', - source_label: 'EVER BRAVE DEVELOPMENTS LTD TAIWAN BRANCH/DINH LU PLASTIC CO., LTD', - target: 'dPiJDJTIuGz9yhg4PDWIrg', - target_type: 'company', - target_label: 'Công Ty TNHH Chang Yang Việt Nam', - field: 'ships_to' - }, - { - source: 'Lzk9y47W4skMWMmCmSaxyw', - source_type: 'company', - source_label: 'Công ty TNHH YOUNG IL Việt Nam', - target: 'gnj8PTONC4yEeG-OCRHluA', - target_type: 'company', - target_label: 'PT. CHANGSHIN REKSA JAYA', - field: 'ships_to' - }, - { - source: '1ebalxTiNs_p4mb5qGAHug', - source_type: 'company', - source_label: 'FGL INTERNATIONAL S. P. A.', - target: 'Lzk9y47W4skMWMmCmSaxyw', - target_type: 'company', - target_label: 'Công ty TNHH YOUNG IL Việt Nam', - field: 'ships_to' - }, - { - source: 'pd45w5GqSTUbFZq42JuWKg', - source_type: 'company', - source_label: 'EQUITAN SRL', - target: 'Lzk9y47W4skMWMmCmSaxyw', - target_type: 'company', - target_label: 'Công ty TNHH YOUNG IL Việt Nam', - field: 'ships_to' - }, - { - source: 'S-AsctZu-oDuGSumvEc-5A', - source_type: 'person', - source_label: 'LS TONGSANG', - target: 'Lzk9y47W4skMWMmCmSaxyw', - target_type: 'company', - target_label: 'Công ty TNHH YOUNG IL Việt Nam', - field: 'ships_to' - }, - { - source: 'olMFadp_CTIgGwXYind68Q', - source_type: 'company', - source_label: 'DONG WOO CHEMTECH CO., LTD', - target: 'Lzk9y47W4skMWMmCmSaxyw', - target_type: 'company', - target_label: 'Công ty TNHH YOUNG IL Việt Nam', - field: 'ships_to' - }, - { - source: 'el0Do8um5HrQcUf8rV1G3g', - source_type: 'company', - source_label: 'AC HOTEL BY MARRIOTT BOSTON CLEVELAND CIRCLE', - target: 'Lzk9y47W4skMWMmCmSaxyw', - target_type: 'company', - target_label: 'Công ty TNHH YOUNG IL Việt Nam', - field: 'ships_to' - }, - { - source: 'vHau25FEFlzZzTqRVjukIg', - source_type: 'company', - source_label: 'A.T.C ( ASSISTANCE TECHNIQUE ET COMMERCIAL)', - target: 'Lzk9y47W4skMWMmCmSaxyw', - target_type: 'company', - target_label: 'Công ty TNHH YOUNG IL Việt Nam', - field: 'ships_to' - }, - { - source: 'fwe-TOC3f0c4c3fSYmFGmA', - source_type: 'company', - source_label: 'A.T.C TANNERY CHEMICALS', - target: 'Lzk9y47W4skMWMmCmSaxyw', - target_type: 'company', - target_label: 'Công ty TNHH YOUNG IL Việt Nam', - field: 'ships_to' - }, - { - source: 'knHYjD7bT29xX1lO2kTkxw', - source_type: 'company', - source_label: 'NEO TECH CO.', - target: 'Lzk9y47W4skMWMmCmSaxyw', - target_type: 'company', - target_label: 'Công ty TNHH YOUNG IL Việt Nam', - field: 'ships_to' - }, - { - source: '3nyeedrH62MsXKk2j8YRMA', - source_type: 'company', - source_label: 'BU KYOUNG TEC CO., LTD', - target: 'Lzk9y47W4skMWMmCmSaxyw', - target_type: 'company', - target_label: 'Công ty TNHH YOUNG IL Việt Nam', - field: 'ships_to' - }, - { - source: 'VmrMLHCh7NECiXmuc-rkuA', - source_type: 'company', - source_label: 'ALCOVER QUIMICA SL.', - target: 'Lzk9y47W4skMWMmCmSaxyw', - target_type: 'company', - target_label: 'Công ty TNHH YOUNG IL Việt Nam', - field: 'ships_to' - }, - { - source: 'NGUZSdZSsvJqD6DBlQdLgw', - source_type: 'company', - source_label: 'SUNG NAM CO., LTD', - target: 'Lzk9y47W4skMWMmCmSaxyw', - target_type: 'company', - target_label: 'Công ty TNHH YOUNG IL Việt Nam', - field: 'ships_to' - }, - { - source: 'GNz-vrdyVqflnF-SeOUnbg', - source_type: 'company', - source_label: 'TAEKYUNG TRADING CO.', - target: 'Lzk9y47W4skMWMmCmSaxyw', - target_type: 'company', - target_label: 'Công ty TNHH YOUNG IL Việt Nam', - field: 'ships_to' - }, - { - source: 'UlUWhLXO9R64VoCgtiHxWw', - source_type: 'company', - source_label: 'MARIO CAIMI S.R.L', - target: 'Lzk9y47W4skMWMmCmSaxyw', - target_type: 'company', - target_label: 'Công ty TNHH YOUNG IL Việt Nam', - field: 'ships_to' - }, - { - source: 'ta2EhlFaGMUF1bTG7LNWqA', - source_type: 'company', - source_label: 'TANKEM-KOREA CO., LTD', - target: 'Lzk9y47W4skMWMmCmSaxyw', - target_type: 'company', - target_label: 'Công ty TNHH YOUNG IL Việt Nam', - field: 'ships_to' - }, - { - source: '282TIh5c-Qq8zfAog6vNag', - source_type: 'company', - source_label: 'TENGDA TECHNOLOGY CO LIMITED', - target: 'Lzk9y47W4skMWMmCmSaxyw', - target_type: 'company', - target_label: 'Công ty TNHH YOUNG IL Việt Nam', - field: 'ships_to' - }, - { - source: '66lUH5a5Zqb7Q9Wpi7T-6Q', - source_type: 'company', - source_label: 'FENCOLOR ITALIA S.R.L', - target: 'Lzk9y47W4skMWMmCmSaxyw', - target_type: 'company', - target_label: 'Công ty TNHH YOUNG IL Việt Nam', - field: 'ships_to' - }, - { - source: 'lW3QtemBDSMqiWUe3fIlaQ', - source_type: 'company', - source_label: 'COSO ELECTRONIC TECH CO., LTD', - target: 'Lzk9y47W4skMWMmCmSaxyw', - target_type: 'company', - target_label: 'Công ty TNHH YOUNG IL Việt Nam', - field: 'ships_to' - }, - { - source: 'ffAYpBBdqQsmIQBMRPE-RQ', - source_type: 'company', - source_label: 'SOCIETA ESERCIZIO STABILIMENTI NERINI S.R.L', - target: 'Lzk9y47W4skMWMmCmSaxyw', - target_type: 'company', - target_label: 'Công ty TNHH YOUNG IL Việt Nam', - field: 'ships_to' - }, - { - source: 'pMqpxrY7mgJSioNgNU1N6Q', - source_type: 'company', - source_label: 'TAE LIM DNC CO., LTD', - target: 'Lzk9y47W4skMWMmCmSaxyw', - target_type: 'company', - target_label: 'Công ty TNHH YOUNG IL Việt Nam', - field: 'ships_to' - }, - { - source: '9ZhgLEuCTs-wW3Orly_odw', - source_type: 'company', - source_label: 'YOUNG IL LEATHER CO.,LTD', - target: 'Lzk9y47W4skMWMmCmSaxyw', - target_type: 'company', - target_label: 'Công ty TNHH YOUNG IL Việt Nam', - field: 'ships_to' - }, - { - source: 'WkiZy5SfYgzJOoPteLA1dw', - source_type: 'company', - source_label: 'TURNER SAS', - target: 'Lzk9y47W4skMWMmCmSaxyw', - target_type: 'company', - target_label: 'Công ty TNHH YOUNG IL Việt Nam', - field: 'ships_to' - }, - { - source: 'HxoiJEiDhf6pQ4nhi37YRg', - source_type: 'company', - source_label: 'JH CHEM TEC CO.,', - target: 'Lzk9y47W4skMWMmCmSaxyw', - target_type: 'company', - target_label: 'Công ty TNHH YOUNG IL Việt Nam', - field: 'ships_to' - }, - { - source: '-gYlix9xK1eDbGG8qETaEA', - source_type: 'company', - source_label: 'JAGOTECH PAPER GMBH', - target: 'Lzk9y47W4skMWMmCmSaxyw', - target_type: 'company', - target_label: 'Công ty TNHH YOUNG IL Việt Nam', - field: 'ships_to' - }, - { - source: 'roQpysn4azNS9pyQ8BTnow', - source_type: 'company', - source_label: 'ZSIVIRA CHEMIE MERK PRIVATE LIMITED', - target: 'Lzk9y47W4skMWMmCmSaxyw', - target_type: 'company', - target_label: 'Công ty TNHH YOUNG IL Việt Nam', - field: 'ships_to' - }, - { - source: 'OCyJWvQo-hdat5uJ5o6L8A', - source_type: 'company', - source_label: 'CHEMAX CO.,LTD', - target: 'Lzk9y47W4skMWMmCmSaxyw', - target_type: 'company', - target_label: 'Công ty TNHH YOUNG IL Việt Nam', - field: 'ships_to' - }, - { - source: 'x2RLaLir4snyobvYbXIH5w', - source_type: 'company', - source_label: 'HANDOK ONDUSTRIAL CO LTD', - target: 'Lzk9y47W4skMWMmCmSaxyw', - target_type: 'company', - target_label: 'Công ty TNHH YOUNG IL Việt Nam', - field: 'ships_to' - }, - { - source: 'Ikhd6ypAyWHq7iIBV9K0pQ', - source_type: 'person', - source_label: 'KATE SPADE', - target: 'Lzk9y47W4skMWMmCmSaxyw', - target_type: 'company', - target_label: 'Công ty TNHH YOUNG IL Việt Nam', - field: 'ships_to' - }, - { - source: 'Uv-2t36plCXa7c52M0v7qw', - source_type: 'company', - source_label: 'B&J CO.,LTD', - target: 'Lzk9y47W4skMWMmCmSaxyw', - target_type: 'company', - target_label: 'Công ty TNHH YOUNG IL Việt Nam', - field: 'ships_to' - }, - { - source: 'nFKUzoV_gQ3lpIFLeS-l9A', - source_type: 'company', - source_label: 'ITA CHEMICALS ASIA LIMITED', - target: 'Lzk9y47W4skMWMmCmSaxyw', - target_type: 'company', - target_label: 'Công ty TNHH YOUNG IL Việt Nam', - field: 'ships_to' - }, - { - source: 'dGYFStdpRWohUUqXGMfBdg', - source_type: 'company', - source_label: 'C & U CO., LTD.', - target: 'Lzk9y47W4skMWMmCmSaxyw', - target_type: 'company', - target_label: 'Công ty TNHH YOUNG IL Việt Nam', - field: 'ships_to' - }, - { - source: 'CyHkXmtCQRijTnwCeLA3Qg', - source_type: 'company', - source_label: 'SUNRISE LEATHER (HK) LIMITED', - target: 'Lzk9y47W4skMWMmCmSaxyw', - target_type: 'company', - target_label: 'Công ty TNHH YOUNG IL Việt Nam', - field: 'ships_to' - }, - { - source: 't7bfl1xS9SW19CzYwZP8Gg', - source_type: 'company', - source_label: 'C/O PIDILITE IND LTD', - target: 'Lzk9y47W4skMWMmCmSaxyw', - target_type: 'company', - target_label: 'Công ty TNHH YOUNG IL Việt Nam', - field: 'ships_to' - }, - { - source: 'XYqMZOqKJIZgc8Cy_3pw4g', - source_type: 'company', - source_label: 'RAINBOW CHEMICAL INDUSTRY LIMITED', - target: 'Lzk9y47W4skMWMmCmSaxyw', - target_type: 'company', - target_label: 'Công ty TNHH YOUNG IL Việt Nam', - field: 'ships_to' - }, - { - source: 'T_cvI28I3Fg6T7c__hDK4Q', - source_type: 'company', - source_label: 'HAN DOK INDUSTRIAL CO., LTD', - target: 'Lzk9y47W4skMWMmCmSaxyw', - target_type: 'company', - target_label: 'Công ty TNHH YOUNG IL Việt Nam', - field: 'ships_to' - }, - { - source: '_XYeDy3YYxCDnOhwmB6Sdw', - source_type: 'company', - source_label: 'ZSCHIMMER AND SCHWARZ GMBH AND CO KG', - target: 'Lzk9y47W4skMWMmCmSaxyw', - target_type: 'company', - target_label: 'Công ty TNHH YOUNG IL Việt Nam', - field: 'ships_to' - }, - { - source: '_UB7wBBc4n4MphQt4k7E2Q', - source_type: 'company', - source_label: 'CM TANNERY MACHINES S.P.A', - target: 'Lzk9y47W4skMWMmCmSaxyw', - target_type: 'company', - target_label: 'Công ty TNHH YOUNG IL Việt Nam', - field: 'ships_to' - }, - { - source: 'azscCWcJesc1YygnKI9Xdg', - source_type: 'company', - source_label: 'ALPA KOREA CO., LTD', - target: 'Lzk9y47W4skMWMmCmSaxyw', - target_type: 'company', - target_label: 'Công ty TNHH YOUNG IL Việt Nam', - field: 'ships_to' - }, - { - source: 'p7igP_hGw3NNHqbAe185Hw', - source_type: 'company', - source_label: 'KDIC CORPORATION', - target: 'Lzk9y47W4skMWMmCmSaxyw', - target_type: 'company', - target_label: 'Công ty TNHH YOUNG IL Việt Nam', - field: 'ships_to' - }, - { - source: 'ElVk9SO-3gvvYo191cSptw', - source_type: 'company', - source_label: 'Công Ty TNHH CHEN TAI (Việt Nam)', - target: 'gnj8PTONC4yEeG-OCRHluA', - target_type: 'company', - target_label: 'PT. CHANGSHIN REKSA JAYA', - field: 'ships_to' - }, - { - source: 'SkGcGAtqs1VCJmjWbBkO_g', - source_type: 'company', - source_label: 'CHEN TAI INTERNATIONAL INVESTMENT CO., LTD. TAIWAN BRANCH (SEYCHELLES)', - target: 'ElVk9SO-3gvvYo191cSptw', - target_type: 'company', - target_label: 'Công Ty TNHH CHEN TAI (Việt Nam)', - field: 'ships_to' - }, - { - source: 'rV-ZrqwTZRsbIqowJkgt8g', - source_type: 'company', - source_label: 'SUZHOU NON-SUCCESS EVERY CORE INTERNATIONAL TRADING CO.,LTD', - target: 'ElVk9SO-3gvvYo191cSptw', - target_type: 'company', - target_label: 'Công Ty TNHH CHEN TAI (Việt Nam)', - field: 'ships_to' - }, - { - source: 'CL11eC3OMS0BS3VCs0nIKA', - source_type: 'company', - source_label: 'SUNRISE PLASTIC LIMITED', - target: 'ElVk9SO-3gvvYo191cSptw', - target_type: 'company', - target_label: 'Công Ty TNHH CHEN TAI (Việt Nam)', - field: 'ships_to' - }, - { - source: '3LX0ZfFNgu8bsqLqUdfuyA', - source_type: 'person', - source_label: 'Cty TNHH Việt Nam Paiho', - target: 'gnj8PTONC4yEeG-OCRHluA', - target_type: 'company', - target_label: 'PT. CHANGSHIN REKSA JAYA', - field: 'ships_to' - }, - { - source: 'qVkukiH_KrMhdhmwT6xeWw', - source_type: 'company', - source_label: 'NANTONG EAST HEPTANOIC MACHINERY CO., LTD', - target: '3LX0ZfFNgu8bsqLqUdfuyA', - target_type: 'person', - target_label: 'Cty TNHH Việt Nam Paiho', - field: 'ships_to' - }, - { - source: 'rAh6nX7kpCEsiaVaBvqhRQ', - source_type: 'company', - source_label: 'HERNG FA INDUSTRIAL CO., LTD', - target: '3LX0ZfFNgu8bsqLqUdfuyA', - target_type: 'person', - target_label: 'Cty TNHH Việt Nam Paiho', - field: 'ships_to' - }, - { - source: 'qlpOYIna_IH3FFT9eL8bfg', - source_type: 'company', - source_label: 'PFT AUTOMA TIONTECHNOLOGY LIMITED', - target: '3LX0ZfFNgu8bsqLqUdfuyA', - target_type: 'person', - target_label: 'Cty TNHH Việt Nam Paiho', - field: 'ships_to' - }, - { - source: '3xmaHtPpxMVyzSuEDlgSLw', - source_type: 'company', - source_label: 'DONGGUAN TINCHIKWAN INTELLIGENT TECHNOLOGY CO., LTD.', - target: '3LX0ZfFNgu8bsqLqUdfuyA', - target_type: 'person', - target_label: 'Cty TNHH Việt Nam Paiho', - field: 'ships_to' - }, - { - source: '50b_fPJAZx21mqIuc3ozhQ', - source_type: 'company', - source_label: 'RENQIU FEIXING TEXTILE MACHINERY CO.,LTD', - target: '3LX0ZfFNgu8bsqLqUdfuyA', - target_type: 'person', - target_label: 'Cty TNHH Việt Nam Paiho', - field: 'ships_to' - }, - { - source: '7Xwsq2GkOKU4mIf8FE5Byg', - source_type: 'company', - source_label: 'CHUN YI YARN TWISTING CO.,LTD', - target: '3LX0ZfFNgu8bsqLqUdfuyA', - target_type: 'person', - target_label: 'Cty TNHH Việt Nam Paiho', - field: 'ships_to' - }, - { - source: 'y1oenfwLluo8usXEn02pMg', - source_type: 'company', - source_label: 'MAERSK LOGISTICS & SERVICES', - target: '875yxpVvxV2RsweKMRiu7g', - target_type: 'company', - target_label: 'NIKE USA, INC.', - field: 'ships_to' - }, - { - source: 'TKhJb22KI31C7fHW6SvGyQ', - source_type: 'person', - source_label: 'PHOENIIX', - target: 'y1oenfwLluo8usXEn02pMg', - target_type: 'company', - target_label: 'MAERSK LOGISTICS & SERVICES', - field: 'ships_to' - }, - { - source: 'jbv17LV73n26wjAXGBZFIw', - source_type: 'company', - source_label: 'DMARK METAL BUTTON COMPANY LIMITED', - target: 'TKhJb22KI31C7fHW6SvGyQ', - target_type: 'person', - target_label: 'PHOENIIX', - field: 'ships_to' - }, - { - source: '9LQYtiQJVqim0V81X0vM4A', - source_type: 'company', - source_label: 'QIDONG QIANFAN NEW MATERIAL CO.,LTD', - target: 'TKhJb22KI31C7fHW6SvGyQ', - target_type: 'person', - target_label: 'PHOENIIX', - field: 'ships_to' - }, - { - source: '7i5mdxfP2AdpzI-iKgQESw', - source_type: 'company', - source_label: 'DAMCO INDIA PRIVATE LIMITED', - target: 'y1oenfwLluo8usXEn02pMg', - target_type: 'company', - target_label: 'MAERSK LOGISTICS & SERVICES', - field: 'ships_to' - }, - { - source: '8UL-H_qWnNnOhZWS-IgbtA', - source_type: 'company', - source_label: 'Maersk Logistics & Services International A/S', - target: '7i5mdxfP2AdpzI-iKgQESw', - target_type: 'company', - target_label: 'DAMCO INDIA PRIVATE LIMITED', - field: 'ships_to' - }, - { - source: 'uqaLfEnnt4FtEAsTuFE4hg', - source_type: 'company', - source_label: 'N.C.JOHN & SONS (P) LTD', - target: '7i5mdxfP2AdpzI-iKgQESw', - target_type: 'company', - target_label: 'DAMCO INDIA PRIVATE LIMITED', - field: 'ships_to' - }, - { - source: 'xADXHpLuOkai9aTnY-496Q', - source_type: 'company', - source_label: 'CHINA ARTS INTERTRANS JIANGSU CO LTD', - target: '7i5mdxfP2AdpzI-iKgQESw', - target_type: 'company', - target_label: 'DAMCO INDIA PRIVATE LIMITED', - field: 'ships_to' - }, - { - source: 'oCKstOgrVbtKFFCt3uafrw', - source_type: 'company', - source_label: 'NINGBO RONGXIN ELECTRIC APPLIANCES CO LTD', - target: '7i5mdxfP2AdpzI-iKgQESw', - target_type: 'company', - target_label: 'DAMCO INDIA PRIVATE LIMITED', - field: 'ships_to' - }, - { - source: '6gYDDgHxQFvOuTnrAU0-fA', - source_type: 'company', - source_label: 'KORMAN SHIPPING CO LTD', - target: 'y1oenfwLluo8usXEn02pMg', - target_type: 'company', - target_label: 'MAERSK LOGISTICS & SERVICES', - field: 'ships_to' - }, - { - source: '92gqinQQjQutkxVVWQsocw', - source_type: 'person', - source_label: 'SFT GONDRAND', - target: '6gYDDgHxQFvOuTnrAU0-fA', - target_type: 'company', - target_label: 'KORMAN SHIPPING CO LTD', - field: 'ships_to' - }, - { - source: 'jio9McDQStiGK81KjYgRLg', - source_type: 'company', - source_label: 'KORMAN INTERNATIONAL CO,LTD', - target: '6gYDDgHxQFvOuTnrAU0-fA', - target_type: 'company', - target_label: 'KORMAN SHIPPING CO LTD', - field: 'ships_to' - }, - { - source: '7bHHKb7AKo0_fnN5SEBZUA', - source_type: 'company', - source_label: 'DAMCO USA INC', - target: 'y1oenfwLluo8usXEn02pMg', - target_type: 'company', - target_label: 'MAERSK LOGISTICS & SERVICES', - field: 'ships_to' - }, - { - source: 'lzwK0JHTDWqHiY5UWKjeLA', - source_type: 'company', - source_label: 'KORMAN SHIPPING CO. LTD SHENZHEN', - target: '7bHHKb7AKo0_fnN5SEBZUA', - target_type: 'company', - target_label: 'DAMCO USA INC', - field: 'ships_to' - }, - { - source: '9ZnnVk4TqK5Hf-lYclVSsg', - source_type: 'company', - source_label: 'MAERSK LOGISTICS & SERVICES JAPAN K.K.', - target: '7bHHKb7AKo0_fnN5SEBZUA', - target_type: 'company', - target_label: 'DAMCO USA INC', - field: 'ships_to' - }, - { - source: 'j3gJpgUWAuPtbTFckbgdDQ', - source_type: 'company', - source_label: 'AMCO INDIA PVT LTD.', - target: '7bHHKb7AKo0_fnN5SEBZUA', - target_type: 'company', - target_label: 'DAMCO USA INC', - field: 'ships_to' - }, - { - source: 'yxMfCncq4TeTgPyZO2NB5Q', - source_type: 'company', - source_label: 'DAMCO CHILE S.A.', - target: '7bHHKb7AKo0_fnN5SEBZUA', - target_type: 'company', - target_label: 'DAMCO USA INC', - field: 'ships_to' - }, - { - source: 'modFk0vIz0mn61-pgr6Z6Q', - source_type: 'company', - source_label: 'DAMCO HONGKONG LTD', - target: '7bHHKb7AKo0_fnN5SEBZUA', - target_type: 'company', - target_label: 'DAMCO USA INC', - field: 'ships_to' - }, - { - source: 'CzlcJF-FpJNlTlvktgvA_Q', - source_type: 'company', - source_label: 'KORMAN SHIPPING COMPANY LIMITED', - target: '7bHHKb7AKo0_fnN5SEBZUA', - target_type: 'company', - target_label: 'DAMCO USA INC', - field: 'ships_to' - }, - { - source: 'HJi9AjE4xFjPrn-oH2E3ag', - source_type: 'company', - source_label: 'PLS USE CODE 42200017952', - target: '7bHHKb7AKo0_fnN5SEBZUA', - target_type: 'company', - target_label: 'DAMCO USA INC', - field: 'ships_to' - }, - { - source: 'etw-jLRUoWCh3WllV7YIig', - source_type: 'company', - source_label: 'DAMCO INDIA PRVIATE LIMITED', - target: '7bHHKb7AKo0_fnN5SEBZUA', - target_type: 'company', - target_label: 'DAMCO USA INC', - field: 'ships_to' - }, - { - source: 'J7HINB6gFsk8mdEXS4T3og', - source_type: 'company', - source_label: 'MAERSK LOGISTICS&SERVICES KOREA L', - target: '7bHHKb7AKo0_fnN5SEBZUA', - target_type: 'company', - target_label: 'DAMCO USA INC', - field: 'ships_to' - }, - { - source: 'JrllVAyPUX1OxrX5ZLmGBw', - source_type: 'company', - source_label: 'MAERSK LOGISTICS&SERVICES MALAYSI JL TANJUNG', - target: '7bHHKb7AKo0_fnN5SEBZUA', - target_type: 'company', - target_label: 'DAMCO USA INC', - field: 'ships_to' - }, - { - source: 'TjF3TvsAhqFe4rpuS-0DTQ', - source_type: 'company', - source_label: 'DAMCO JAPAN K.K.ON BEHALF OF DAMC INTERNATIONAL B.V.', - target: '7bHHKb7AKo0_fnN5SEBZUA', - target_type: 'company', - target_label: 'DAMCO USA INC', - field: 'ships_to' - }, - { - source: 'WHxCa4nldeGKc8y85xs37g', - source_type: 'company', - source_label: 'DAMCO CHINA LIMITED QINGDAO BRANC FLAG SHIP TOWER', - target: '7bHHKb7AKo0_fnN5SEBZUA', - target_type: 'company', - target_label: 'DAMCO USA INC', - field: 'ships_to' - }, - { - source: 'fwqbbCC1N7XZwnmCnCiDMQ', - source_type: 'company', - source_label: 'MAERSK DENMARK A/S', - target: '7bHHKb7AKo0_fnN5SEBZUA', - target_type: 'company', - target_label: 'DAMCO USA INC', - field: 'ships_to' - }, - { - source: 'pnlxkBnofo4peuT4iAcUbQ', - source_type: 'company', - source_label: 'DAMCO JAPAN K.K.ON BEHARLF OF DAM INTERNATIONAL B.V.', - target: '7bHHKb7AKo0_fnN5SEBZUA', - target_type: 'company', - target_label: 'DAMCO USA INC', - field: 'ships_to' - }, - { - source: 'h5XDqmqCRzFp6DvCHGNKlQ', - source_type: 'company', - source_label: 'MAERSK LOGISTICS&SERVICES MALAYSI JALAN TANJUNG A/', - target: '7bHHKb7AKo0_fnN5SEBZUA', - target_type: 'company', - target_label: 'DAMCO USA INC', - field: 'ships_to' - }, - { - source: 'OzUMOsvqzksKySFazxydbA', - source_type: 'company', - source_label: 'MAERSK LOGISTICS AND SERVICES FASCINATIO BOULEVARD', - target: '7bHHKb7AKo0_fnN5SEBZUA', - target_type: 'company', - target_label: 'DAMCO USA INC', - field: 'ships_to' - }, - { - source: 'djsQwFecu4f9jIZJvzq4SQ', - source_type: 'company', - source_label: 'DAMCO JAPAN K.K.', - target: '7bHHKb7AKo0_fnN5SEBZUA', - target_type: 'company', - target_label: 'DAMCO USA INC', - field: 'ships_to' - }, - { - source: 'Z5cZFF_q0M2AODi-JAhShQ', - source_type: 'company', - source_label: 'DAMCO NINGBO BRANCH', - target: '7bHHKb7AKo0_fnN5SEBZUA', - target_type: 'company', - target_label: 'DAMCO USA INC', - field: 'ships_to' - }, - { - source: 'WkwjJmvpNmsAyAnGepN13A', - source_type: 'company', - source_label: 'DAMCO LOGISTICS KOREA LIMITED CRE', - target: '7bHHKb7AKo0_fnN5SEBZUA', - target_type: 'company', - target_label: 'DAMCO USA INC', - field: 'ships_to' - }, - { - source: 'pZqstjq8FWFE5GpYEIUSSA', - source_type: 'company', - source_label: 'FOREWAY LOGISTICS (PVT) LIMITED', - target: '7bHHKb7AKo0_fnN5SEBZUA', - target_type: 'company', - target_label: 'DAMCO USA INC', - field: 'ships_to' - }, - { - source: 'JjVF4dpSylqcnFyCJr8eqA', - source_type: 'company', - source_label: 'DAMCO JAPAN K.K.ON BEHALF OF DAMCO INTERNATIONAL B.V.', - target: '7bHHKb7AKo0_fnN5SEBZUA', - target_type: 'company', - target_label: 'DAMCO USA INC', - field: 'ships_to' - }, - { - source: 'scm8id2LumSm3WJmI4PuOw', - source_type: 'company', - source_label: 'DAMCO LOGISTICS (THAILAND) CO., LTD', - target: '7bHHKb7AKo0_fnN5SEBZUA', - target_type: 'company', - target_label: 'DAMCO USA INC', - field: 'ships_to' - }, - { - source: 'ktipxeIEF55QCzVdbfP7iw', - source_type: 'company', - source_label: 'DAMCO JAPAN K.K.ON BEHALF OF DAMCO INTERNATIONAL B.V.V', - target: '7bHHKb7AKo0_fnN5SEBZUA', - target_type: 'company', - target_label: 'DAMCO USA INC', - field: 'ships_to' - }, - { - source: 'qhv5GINGrrBxMkkvFFNGKw', - source_type: 'company', - source_label: 'KORMAN SHIPPING CO., LTD O/B KORMAN SHIPPING CO., LTD', - target: '7bHHKb7AKo0_fnN5SEBZUA', - target_type: 'company', - target_label: 'DAMCO USA INC', - field: 'ships_to' - }, - { - source: 'NGYfJrPKZgrZxL3yoUciAA', - source_type: 'company', - source_label: 'DAMCO PAKISTAN PVT LIMITED', - target: '7bHHKb7AKo0_fnN5SEBZUA', - target_type: 'company', - target_label: 'DAMCO USA INC', - field: 'ships_to' - }, - { - source: 'i3lfIFMMirriZOMlqgCPcw', - source_type: 'company', - source_label: 'MAERS ITALIA SPA', - target: '7bHHKb7AKo0_fnN5SEBZUA', - target_type: 'company', - target_label: 'DAMCO USA INC', - field: 'ships_to' - }, - { - source: 'Z_R3Ol2j_-dsOM7UuH3PTw', - source_type: 'company', - source_label: 'PT. KANINDO MAKMUR JAYA', - target: '875yxpVvxV2RsweKMRiu7g', - target_type: 'company', - target_label: 'NIKE USA, INC.', - field: 'ships_to' - }, - { - source: 'gdAQnpO4Ur8gdyHPPic-3g', - source_type: 'company', - source_label: 'Gul Ahmed Textile Mills Ltd', - target: 'Z_R3Ol2j_-dsOM7UuH3PTw', - target_type: 'company', - target_label: 'PT. KANINDO MAKMUR JAYA', - field: 'ships_to' - }, - { - source: 'zZ7Ld4jfxffrjb-c-uMCLg', - source_type: 'company', - source_label: 'SLC AGRICOLA S.A. -', - target: 'gdAQnpO4Ur8gdyHPPic-3g', - target_type: 'company', - target_label: 'Gul Ahmed Textile Mills Ltd', - field: 'ships_to' - }, - { - source: 'EbYkwTlltxKm93aFmwnr6Q', - source_type: 'company', - source_label: 'SLC AGRICOLA S.A. FAZENDA PANTANAL II ROD GO', - target: 'zZ7Ld4jfxffrjb-c-uMCLg', - target_type: 'company', - target_label: 'SLC AGRICOLA S.A. -', - field: 'ships_to' - }, - { - source: '4O7oZmLCm_z8wPLBTuKi4Q', - source_type: 'company', - source_label: 'SCHRODER & VOGEL GMBH', - target: 'gdAQnpO4Ur8gdyHPPic-3g', - target_type: 'company', - target_label: 'Gul Ahmed Textile Mills Ltd', - field: 'ships_to' - }, - { - source: '8PupZUriUI4omSKa4ayzNg', - source_type: 'company', - source_label: 'AVANEETHA TEXTILES (P) LTD', - target: '4O7oZmLCm_z8wPLBTuKi4Q', - target_type: 'company', - target_label: 'SCHRODER & VOGEL GMBH', - field: 'ships_to' - }, - { - source: 'mmUw3_AOYrgtiPEBoOZsZw', - source_type: 'company', - source_label: 'ООО "KHUMOYUN IMPEX', - target: '4O7oZmLCm_z8wPLBTuKi4Q', - target_type: 'company', - target_label: 'SCHRODER & VOGEL GMBH', - field: 'ships_to' - }, - { - source: 'EvLGfej9wOebHSyBAAiL5g', - source_type: 'company', - source_label: 'LX PANTOS', - target: 'gdAQnpO4Ur8gdyHPPic-3g', - target_type: 'company', - target_label: 'Gul Ahmed Textile Mills Ltd', - field: 'ships_to' - }, - { - source: 'vlC_1_swUfhdF1O1If7TiA', - source_type: 'person', - source_label: 'HANKOOK', - target: 'EvLGfej9wOebHSyBAAiL5g', - target_type: 'company', - target_label: 'LX PANTOS', - field: 'ships_to' - }, - { - source: '099K6W_pvK-sIPVA19cszQ', - source_type: 'person', - source_label: 'HYOSUNG', - target: 'EvLGfej9wOebHSyBAAiL5g', - target_type: 'company', - target_label: 'LX PANTOS', - field: 'ships_to' - }, - { - source: 'QK8hpg_GKeDHhKekrLIMVQ', - source_type: 'company', - source_label: 'LACHESIS CO., LTD.', - target: 'EvLGfej9wOebHSyBAAiL5g', - target_type: 'company', - target_label: 'LX PANTOS', - field: 'ships_to' - }, - { - source: 'pTOw8gwcz3cJLiUdDfOmyQ', - source_type: 'company', - source_label: 'LX PANTOS VIETNAM CO., LTD', - target: 'EvLGfej9wOebHSyBAAiL5g', - target_type: 'company', - target_label: 'LX PANTOS', - field: 'ships_to' - }, - { - source: 'KD3kWoMGPiIvEIF6h1t_eA', - source_type: 'company', - source_label: 'SUL DE MINAS INGREDIENTES LTDA', - target: 'EvLGfej9wOebHSyBAAiL5g', - target_type: 'company', - target_label: 'LX PANTOS', - field: 'ships_to' - }, - { - source: 'Ltq9E3IL6c6UnVkm1rM1nQ', - source_type: 'company', - source_label: 'SOUTHCO INDIA PVT. LTD.', - target: 'EvLGfej9wOebHSyBAAiL5g', - target_type: 'company', - target_label: 'LX PANTOS', - field: 'ships_to' - }, - { - source: 'fBQL7wJqTbrgqP7gEEeDZA', - source_type: 'company', - source_label: 'DSV', - target: 'EvLGfej9wOebHSyBAAiL5g', - target_type: 'company', - target_label: 'LX PANTOS', - field: 'ships_to' - }, - { - source: 'dZqUiB2HNHWfA3H7N5c-8w', - source_type: 'company', - source_label: 'Pt Lx Pantos Indonesia Kawasan Industries', - target: 'EvLGfej9wOebHSyBAAiL5g', - target_type: 'company', - target_label: 'LX PANTOS', - field: 'ships_to' - }, - { - source: 'lfPRFv_D4br8MHICrmd2gw', - source_type: 'company', - source_label: 'LG MMA CORP.', - target: 'EvLGfej9wOebHSyBAAiL5g', - target_type: 'company', - target_label: 'LX PANTOS', - field: 'ships_to' - }, - { - source: '_ZzYVj4PdLNbJPzki4XezQ', - source_type: 'company', - source_label: 'HANAM TEXTILE COMPANY', - target: 'gdAQnpO4Ur8gdyHPPic-3g', - target_type: 'company', - target_label: 'Gul Ahmed Textile Mills Ltd', - field: 'ships_to' - }, - { - source: 'H1oGJI-KX28MqOtTHEI85g', - source_type: 'person', - source_label: 'KAIPAA BOBBINS', - target: '_ZzYVj4PdLNbJPzki4XezQ', - target_type: 'company', - target_label: 'HANAM TEXTILE COMPANY', - field: 'ships_to' - }, - { - source: '1q-qiAkgeyZO0ssY4DpjhQ', - source_type: 'company', - source_label: 'SOJITZ MACHINERY CORPORATION', - target: 'gdAQnpO4Ur8gdyHPPic-3g', - target_type: 'company', - target_label: 'Gul Ahmed Textile Mills Ltd', - field: 'ships_to' - }, - { - source: 'jLfkcSklnWQtzH-yaXc8uA', - source_type: 'company', - source_label: 'RABA AXLE LTD.', - target: '1q-qiAkgeyZO0ssY4DpjhQ', - target_type: 'company', - target_label: 'SOJITZ MACHINERY CORPORATION', - field: 'ships_to' - }, - { - source: 'LPZs073A_H5EulXLDd_1Kw', - source_type: 'company', - source_label: 'SOJITZ MACHINERY CORPORATION TOKYO JAPAN', - target: '1q-qiAkgeyZO0ssY4DpjhQ', - target_type: 'company', - target_label: 'SOJITZ MACHINERY CORPORATION', - field: 'ships_to' - }, - { - source: 'OpEGnhUpyCVn-yMSePlE7A', - source_type: 'company', - source_label: 'Công Ty TNHH Dệt Hà Nam', - target: 'gdAQnpO4Ur8gdyHPPic-3g', - target_type: 'company', - target_label: 'Gul Ahmed Textile Mills Ltd', - field: 'ships_to' - }, - { - source: 'H5XitINIykLkxgs7FMD1AA', - source_type: 'company', - source_label: 'GOETZ AND SONS INCORPORATED', - target: 'OpEGnhUpyCVn-yMSePlE7A', - target_type: 'company', - target_label: 'Công Ty TNHH Dệt Hà Nam', - field: 'ships_to' - }, - { - source: 'lgARqBIT3_GcZHCfPnMiKQ', - source_type: 'company', - source_label: 'OLAM AGRI AMERICAS, INC', - target: 'gdAQnpO4Ur8gdyHPPic-3g', - target_type: 'company', - target_label: 'Gul Ahmed Textile Mills Ltd', - field: 'ships_to' - }, - { - source: 'TRIkUPL6azccXaXVccbGSw', - source_type: 'person', - source_label: 'OLAM COTTON', - target: 'lgARqBIT3_GcZHCfPnMiKQ', - target_type: 'company', - target_label: 'OLAM AGRI AMERICAS, INC', - field: 'ships_to' - }, - { - source: 'sW89C-PdVENsoNtUluXeaw', - source_type: 'company', - source_label: 'OLAM GLOBAL AGRI PERU SAC', - target: 'lgARqBIT3_GcZHCfPnMiKQ', - target_type: 'company', - target_label: 'OLAM AGRI AMERICAS, INC', - field: 'ships_to' - }, - { - source: 'arSWN-foFbT4_jtNYGC2Lw', - source_type: 'company', - source_label: 'LEXZAU, SCHARBAU GMBH & CO KG', - target: 'gdAQnpO4Ur8gdyHPPic-3g', - target_type: 'company', - target_label: 'Gul Ahmed Textile Mills Ltd', - field: 'ships_to' - }, - { - source: 'P1OojSELZIuszlGgNwwDsg', - source_type: 'company', - source_label: 'LESCHACO KOREA O/B OF', - target: 'arSWN-foFbT4_jtNYGC2Lw', - target_type: 'company', - target_label: 'LEXZAU, SCHARBAU GMBH & CO KG', - field: 'ships_to' - }, - { - source: 'I5BydauAUgAkNqkQ_T0ztQ', - source_type: 'company', - source_label: 'LESCHACO (CHINA) LIMITED NINGBO', - target: 'arSWN-foFbT4_jtNYGC2Lw', - target_type: 'company', - target_label: 'LEXZAU, SCHARBAU GMBH & CO KG', - field: 'ships_to' - }, - { - source: '_GePUmQxC3NJjmHpKJXyPQ', - source_type: 'company', - source_label: 'MOL CONSOLIDATION SERVICE LTD', - target: '23vQxJdeBrvwq5UgIHOnPw', - target_type: 'company', - target_label: 'ARCTERYX EQUIPMENT', - field: 'ships_to' - }, - { - source: 'hzIaFKpm5qTSQ4OcY_bceg', - source_type: 'company', - source_label: 'MOL CONSOLIDATION SERVICE LIMITED', - target: '_GePUmQxC3NJjmHpKJXyPQ', - target_type: 'company', - target_label: 'MOL CONSOLIDATION SERVICE LTD', - field: 'ships_to' - }, - { - source: 'aT8JFtKy9tIEADYpCJbbAw', - source_type: 'company', - source_label: 'MOL CONSOLIDATION SERVICE LIMITED SHENZHEN BRANCH', - target: 'hzIaFKpm5qTSQ4OcY_bceg', - target_type: 'company', - target_label: 'MOL CONSOLIDATION SERVICE LIMITED', - field: 'ships_to' - }, - { - source: 'uabqIP8ejN2B3fhAHuJwTA', - source_type: 'company', - source_label: 'BRANCH OF MOL CONSOLIDATION SERVICE LIMITED', - target: 'hzIaFKpm5qTSQ4OcY_bceg', - target_type: 'company', - target_label: 'MOL CONSOLIDATION SERVICE LIMITED', - field: 'ships_to' - }, - { - source: 'w5jyY5NtgVKAF8iBo7zjiQ', - source_type: 'company', - source_label: 'MOL CONSOLIDATION SERVICE (VIETNAM) CO.,LTD', - target: 'hzIaFKpm5qTSQ4OcY_bceg', - target_type: 'company', - target_label: 'MOL CONSOLIDATION SERVICE LIMITED', - field: 'ships_to' - }, - { - source: '_Kvu9lxrQOFVFBWWX2nJDw', - source_type: 'company', - source_label: 'YOUNGONE (CEPZ) LTD', - target: '23vQxJdeBrvwq5UgIHOnPw', - target_type: 'company', - target_label: 'ARCTERYX EQUIPMENT', - field: 'ships_to' - }, - { - source: '6VExO6TrtSDHnGcoGTEcMQ', - source_type: 'company', - source_label: 'KRISHNA LAMICOAT PRIVATE LIMITED', - target: '_Kvu9lxrQOFVFBWWX2nJDw', - target_type: 'company', - target_label: 'YOUNGONE (CEPZ) LTD', - field: 'ships_to' - }, - { - source: 'tIv1JANDINjyzYpogb4h_A', - source_type: 'company', - source_label: 'DNZ RESOURCES FZC', - target: '6VExO6TrtSDHnGcoGTEcMQ', - target_type: 'company', - target_label: 'KRISHNA LAMICOAT PRIVATE LIMITED', - field: 'ships_to' - }, - { - source: 'M3l5NgAY8qkoaVrul793hQ', - source_type: 'company', - source_label: 'QADRI GLOBAL INC', - target: '6VExO6TrtSDHnGcoGTEcMQ', - target_type: 'company', - target_label: 'KRISHNA LAMICOAT PRIVATE LIMITED', - field: 'ships_to' - }, - { - source: 'QzlmPuewCXCPeVWjckn56g', - source_type: 'company', - source_label: 'CHAMPION MACHINERY MANUFACTURING COMPANY', - target: '6VExO6TrtSDHnGcoGTEcMQ', - target_type: 'company', - target_label: 'KRISHNA LAMICOAT PRIVATE LIMITED', - field: 'ships_to' - }, - { - source: 'IOXeV8184hZua3rWOC48Iw', - source_type: 'company', - source_label: 'UMLENSKI EOOD VAT BG', - target: '6VExO6TrtSDHnGcoGTEcMQ', - target_type: 'company', - target_label: 'KRISHNA LAMICOAT PRIVATE LIMITED', - field: 'ships_to' - }, - { - source: 'JDn867-zbtF-5jmGhCZYWA', - source_type: 'company', - source_label: 'Công Ty TNHH Sơn Hà', - target: 'Be1vdQekKL83u9Aq_rEWFw', - target_type: 'company', - target_label: 'ECLAT TEXTILE CO., LTD', - field: 'ships_to' - }, - { - source: 'xxfi95LpHIhVJnfKaudYBQ', - source_type: 'company', - source_label: 'RUSHAN LONGMA GARMENT CO.,LTD', - target: 'JDn867-zbtF-5jmGhCZYWA', - target_type: 'company', - target_label: 'Công Ty TNHH Sơn Hà', - field: 'ships_to' - }, - { - source: '4Jkdon6XCOev7AUsJ1HOmw', - source_type: 'company', - source_label: 'CôNG TY TNHH ĐầU Tư Và PHáT TRIểN MINH QUANG VINA', - target: 'xxfi95LpHIhVJnfKaudYBQ', - target_type: 'company', - target_label: 'RUSHAN LONGMA GARMENT CO.,LTD', - field: 'ships_to' - }, - { - source: 'e8ES2_QBlXRGTdJQIbnFgQ', - source_type: 'company', - source_label: 'VINEX, SPOL. S.R.O.', - target: 'JDn867-zbtF-5jmGhCZYWA', - target_type: 'company', - target_label: 'Công Ty TNHH Sơn Hà', - field: 'ships_to' - }, - { - source: 'DM194iFyiENALb5Cs8U8-w', - source_type: 'company', - source_label: 'CôNG TY TNHH MAY MặC XUấT NHậP KHẩU GALAXY VINA', - target: 'e8ES2_QBlXRGTdJQIbnFgQ', - target_type: 'company', - target_label: 'VINEX, SPOL. S.R.O.', - field: 'ships_to' - }, - { - source: 'FIdog3J2WSI6M9hRhKVF9A', - source_type: 'company', - source_label: 'CONG TY TNHH GUNZE VIET NAM', - target: 'JDn867-zbtF-5jmGhCZYWA', - target_type: 'company', - target_label: 'Công Ty TNHH Sơn Hà', - field: 'ships_to' - }, - { - source: 'UmRoeP24T-CTActOKg8BRg', - source_type: 'person', - source_label: 'Cty TNHH Phước Lộc Thành', - target: 'FIdog3J2WSI6M9hRhKVF9A', - target_type: 'company', - target_label: 'CONG TY TNHH GUNZE VIET NAM', - field: 'ships_to' - }, - { - source: 'lB6DP6_wC1yypC1zjq9gBg', - source_type: 'company', - source_label: 'CONG TY TNHH SAN XUAT - THUONG MAI - DICH VU PHUOC TAM HANG', - target: 'FIdog3J2WSI6M9hRhKVF9A', - target_type: 'company', - target_label: 'CONG TY TNHH GUNZE VIET NAM', - field: 'ships_to' - }, - { - source: 'WrbZrvUVD8JLAv5s-CaGBw', - source_type: 'company', - source_label: 'CÔNG TY TNHH MỘT THÀNH VIÊN MAY MẶC VĨNH MAI', - target: 'FIdog3J2WSI6M9hRhKVF9A', - target_type: 'company', - target_label: 'CONG TY TNHH GUNZE VIET NAM', - field: 'ships_to' - }, - { - source: 'WinIZgxQHnKrznqrw8ON8Q', - source_type: 'company', - source_label: 'Công Ty TNHH DV TM SX Hưng Thịnh Lợi', - target: 'FIdog3J2WSI6M9hRhKVF9A', - target_type: 'company', - target_label: 'CONG TY TNHH GUNZE VIET NAM', - field: 'ships_to' - }, - { - source: 'wyFBznHrsnRV5s3FvlZI6g', - source_type: 'company', - source_label: 'CONG TY TNHH SAN XUAT THUONG MAI KY THUAT BAO CHAU', - target: 'FIdog3J2WSI6M9hRhKVF9A', - target_type: 'company', - target_label: 'CONG TY TNHH GUNZE VIET NAM', - field: 'ships_to' - }, - { - source: 'tih_qbrqJ6bPL2D2P1rc_A', - source_type: 'company', - source_label: 'Công Ty TNHH May Nhật Tân', - target: 'FIdog3J2WSI6M9hRhKVF9A', - target_type: 'company', - target_label: 'CONG TY TNHH GUNZE VIET NAM', - field: 'ships_to' - }, - { - source: '7cb3OqbKZ4PSKp1d67nX6A', - source_type: 'company', - source_label: 'Công Ty TNHH Sản Xuất Xuất Nhập Khẩu Tường Đức Phú', - target: 'FIdog3J2WSI6M9hRhKVF9A', - target_type: 'company', - target_label: 'CONG TY TNHH GUNZE VIET NAM', - field: 'ships_to' - }, - { - source: 'MAS-5HBaH8KxjI3zMsborA', - source_type: 'company', - source_label: 'CONG TY TNHH KY THUAT HM TECH', - target: 'FIdog3J2WSI6M9hRhKVF9A', - target_type: 'company', - target_label: 'CONG TY TNHH GUNZE VIET NAM', - field: 'ships_to' - }, - { - source: 'L8RQOFDgCLWQVub-xS5xIQ', - source_type: 'company', - source_label: 'IFG CORPORATION', - target: 'JDn867-zbtF-5jmGhCZYWA', - target_type: 'company', - target_label: 'Công Ty TNHH Sơn Hà', - field: 'ships_to' - }, - { - source: 'ogw_dCjnIUUydVhDXVlI2g', - source_type: 'company', - source_label: 'MINH ANH KIM LIEN GARMENT JSC', - target: 'L8RQOFDgCLWQVub-xS5xIQ', - target_type: 'company', - target_label: 'IFG CORPORATION', - field: 'ships_to' - }, - { - source: 'SNm-deybr6-NcCWokeFMtQ', - source_type: 'company', - source_label: 'M U FASHION LTD', - target: 'L8RQOFDgCLWQVub-xS5xIQ', - target_type: 'company', - target_label: 'IFG CORPORATION', - field: 'ships_to' - }, - { - source: '8IHwQjOzOSrQTeoZIhXCrw', - source_type: 'company', - source_label: 'NLZ FASHION LTD', - target: 'L8RQOFDgCLWQVub-xS5xIQ', - target_type: 'company', - target_label: 'IFG CORPORATION', - field: 'ships_to' - }, - { - source: '-A29KkCVo7oQpgDtvJQ4DA', - source_type: 'company', - source_label: 'AMIR SHIRTS LTD', - target: 'L8RQOFDgCLWQVub-xS5xIQ', - target_type: 'company', - target_label: 'IFG CORPORATION', - field: 'ships_to' - }, - { - source: 'Kh6seN1Xl9gqB3_S9aD-7w', - source_type: 'company', - source_label: 'RDM APPARELS LIMITED', - target: 'L8RQOFDgCLWQVub-xS5xIQ', - target_type: 'company', - target_label: 'IFG CORPORATION', - field: 'ships_to' - }, - { - source: 'cjEvV-YXZMO3sbSLLJA3zA', - source_type: 'company', - source_label: 'TOP ROYAL FLASH VIETNAM CO., LTD', - target: 'L8RQOFDgCLWQVub-xS5xIQ', - target_type: 'company', - target_label: 'IFG CORPORATION', - field: 'ships_to' - }, - { - source: 'MuzgULAMahYnpyFRrGCXcw', - source_type: 'company', - source_label: 'SIRINA GARMENTS AND TEXTILE LTD', - target: 'L8RQOFDgCLWQVub-xS5xIQ', - target_type: 'company', - target_label: 'IFG CORPORATION', - field: 'ships_to' - }, - { - source: 'AHxUxxuosfh9J_UO2zTCyw', - source_type: 'company', - source_label: 'KATTALI TEXTILE LIMITED', - target: 'L8RQOFDgCLWQVub-xS5xIQ', - target_type: 'company', - target_label: 'IFG CORPORATION', - field: 'ships_to' - }, - { - source: '88KZYTmhJ-AqaXUhIYsY2w', - source_type: 'company', - source_label: 'BYZID APPARELS (PVT) LTD', - target: 'L8RQOFDgCLWQVub-xS5xIQ', - target_type: 'company', - target_label: 'IFG CORPORATION', - field: 'ships_to' - }, - { - source: 'LUgBwgjbrtp-ETTEMwzaIQ', - source_type: 'company', - source_label: 'NEW ASIA FASHIONS LIMITED', - target: 'L8RQOFDgCLWQVub-xS5xIQ', - target_type: 'company', - target_label: 'IFG CORPORATION', - field: 'ships_to' - }, - { - source: 'Bu_3SPz-vgiOZtnrtv5n3g', - source_type: 'company', - source_label: 'FARMIN FASHION DESIGN LTD', - target: 'L8RQOFDgCLWQVub-xS5xIQ', - target_type: 'company', - target_label: 'IFG CORPORATION', - field: 'ships_to' - }, - { - source: 'YQbR1WKYZKJeFXUf6uv5oQ', - source_type: 'company', - source_label: 'HOA DO 3 CO., LTD.', - target: 'L8RQOFDgCLWQVub-xS5xIQ', - target_type: 'company', - target_label: 'IFG CORPORATION', - field: 'ships_to' - }, - { - source: 'Qesp_rhWD1IANk6UWTRlfQ', - source_type: 'company', - source_label: 'FARMIN APPARELS LIMITED', - target: 'L8RQOFDgCLWQVub-xS5xIQ', - target_type: 'company', - target_label: 'IFG CORPORATION', - field: 'ships_to' - }, - { - source: 'lpgy8uwv8eG_Dl4qspRYDw', - source_type: 'company', - source_label: 'INDEPENDENT APPARELS LIMITED', - target: 'L8RQOFDgCLWQVub-xS5xIQ', - target_type: 'company', - target_label: 'IFG CORPORATION', - field: 'ships_to' - }, - { - source: 'zW_nydyIm8O3VD33pe0o0Q', - source_type: 'company', - source_label: 'CôNG TY TNHH NGUồN á CHâU', - target: 'Be1vdQekKL83u9Aq_rEWFw', - target_type: 'company', - target_label: 'ECLAT TEXTILE CO., LTD', - field: 'ships_to' - }, - { - source: 'h1c1zINOWdVkED8hp9ispA', - source_type: 'company', - source_label: 'MADEIRA GARNFABRIK RUDOLF SCHMIDT KG', - target: 'zW_nydyIm8O3VD33pe0o0Q', - target_type: 'company', - target_label: 'CôNG TY TNHH NGUồN á CHâU', - field: 'ships_to' - }, - { - source: '_pPxcNFwuMu_5FSWOv4w6g', - source_type: 'company', - source_label: 'KINGFLOWER THREAD(HK)CO.,LIMITED', - target: 'h1c1zINOWdVkED8hp9ispA', - target_type: 'company', - target_label: 'MADEIRA GARNFABRIK RUDOLF SCHMIDT KG', - field: 'ships_to' - }, - { - source: 'T4MPSlvIEaYFldsX2xb7fA', - source_type: 'person', - source_label: 'Cty TNHH Dây Khóa Kéo KEEN CHING', - target: 'Be1vdQekKL83u9Aq_rEWFw', - target_type: 'company', - target_label: 'ECLAT TEXTILE CO., LTD', - field: 'ships_to' - }, - { - source: 'hiGgxEXPgFXhqHk6i1G6zg', - source_type: 'company', - source_label: 'CÔNG TY TNHH CỮU PHÚ', - target: 'T4MPSlvIEaYFldsX2xb7fA', - target_type: 'person', - target_label: 'Cty TNHH Dây Khóa Kéo KEEN CHING', - field: 'ships_to' - }, - { - source: 'DKIXZUwkld43RoWu3KTWpA', - source_type: 'company', - source_label: 'JOFULL ENTERPRISE CO.,LTD', - target: 'hiGgxEXPgFXhqHk6i1G6zg', - target_type: 'company', - target_label: 'CÔNG TY TNHH CỮU PHÚ', - field: 'ships_to' - }, - { - source: 'ByaP64YCoZNVRIpXaUUKMQ', - source_type: 'company', - source_label: 'GUANGDONG BORUNTE TECHNOLOGY CO.,LTD', - target: 'hiGgxEXPgFXhqHk6i1G6zg', - target_type: 'company', - target_label: 'CÔNG TY TNHH CỮU PHÚ', - field: 'ships_to' - }, - { - source: 'DF4w9KjlJ-A__x_6iWz60Q', - source_type: 'company', - source_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', - target: 'T4MPSlvIEaYFldsX2xb7fA', - target_type: 'person', - target_label: 'Cty TNHH Dây Khóa Kéo KEEN CHING', - field: 'ships_to' - }, - { - source: 'VKupH0pj4YhUwC6WD8TxGA', - source_type: 'company', - source_label: 'WUXI YIH SHING CHEUN MACHINE CO., LTD', - target: 'DF4w9KjlJ-A__x_6iWz60Q', - target_type: 'company', - target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', - field: 'ships_to' - }, - { - source: 'fKTs7nnpxdQxahXh3Nq9JA', - source_type: 'company', - source_label: 'WEI TAI CORPORATION', - target: 'DF4w9KjlJ-A__x_6iWz60Q', - target_type: 'company', - target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', - field: 'ships_to' - }, - { - source: '9C5_d83OpEwNewVVOjHNrw', - source_type: 'company', - source_label: 'CELLULE CO., LTD', - target: 'DF4w9KjlJ-A__x_6iWz60Q', - target_type: 'company', - target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', - field: 'ships_to' - }, - { - source: 'x65TbmYhGSttNMadWTe3pw', - source_type: 'company', - source_label: 'KAI CHU INTERNATIONAL CO., LTD', - target: 'DF4w9KjlJ-A__x_6iWz60Q', - target_type: 'company', - target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', - field: 'ships_to' - }, - { - source: 'HRhx5phSt7svZRLQg6dkmQ', - source_type: 'company', - source_label: 'CHANGZHOU ZHANYE CONSTRUCTION MACHINERY CO., LTD', - target: 'DF4w9KjlJ-A__x_6iWz60Q', - target_type: 'company', - target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', - field: 'ships_to' - }, - { - source: 'tWKCgz02--b74qoWA95xqQ', - source_type: 'company', - source_label: 'PEIR JIUH ENTERPRISE CO., LTD', - target: 'DF4w9KjlJ-A__x_6iWz60Q', - target_type: 'company', - target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', - field: 'ships_to' - }, - { - source: 'ryzCj9dCSzbaCDsz0h-Jlg', - source_type: 'company', - source_label: 'QUINN LIN CO., LTD', - target: 'DF4w9KjlJ-A__x_6iWz60Q', - target_type: 'company', - target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', - field: 'ships_to' - }, - { - source: 'cNG08yZf9q6ZMY7nVYA2ew', - source_type: 'company', - source_label: "XI'AN ARESWIN PRECISION MACHINERY CO.,LTD", - target: 'DF4w9KjlJ-A__x_6iWz60Q', - target_type: 'company', - target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', - field: 'ships_to' - }, - { - source: 'qxihlhEk7ukFF-QQQZLOxQ', - source_type: 'company', - source_label: 'NEWNOL BIOTECH CO., LTD.', - target: 'DF4w9KjlJ-A__x_6iWz60Q', - target_type: 'company', - target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', - field: 'ships_to' - }, - { - source: '5pMw3lvZF6qJtPvdxK_ZQA', - source_type: 'company', - source_label: 'WUXI HONGYUAN ELECTROMECHANICAL TECHNOLOGY CO., LTD', - target: 'DF4w9KjlJ-A__x_6iWz60Q', - target_type: 'company', - target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', - field: 'ships_to' - }, - { - source: 'GJyRWZ96de2RRiTcMS_Uaw', - source_type: 'company', - source_label: 'YSR REED CO., LTD', - target: 'DF4w9KjlJ-A__x_6iWz60Q', - target_type: 'company', - target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', - field: 'ships_to' - }, - { - source: 'y5H2UrmEBdNi2N-sXJWIng', - source_type: 'company', - source_label: 'SHANGHAI MITSUBOSHI TRADING CO.,LTD', - target: 'DF4w9KjlJ-A__x_6iWz60Q', - target_type: 'company', - target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', - field: 'ships_to' - }, - { - source: 'VyOd8MTrV5--TnMsNqgrkg', - source_type: 'company', - source_label: 'YOUNARUI INTERNATIONAL TRADING CO., LTD', - target: 'DF4w9KjlJ-A__x_6iWz60Q', - target_type: 'company', - target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', - field: 'ships_to' - }, - { - source: 'TvLMDrbn5BHeFkf6uZASDA', - source_type: 'company', - source_label: 'YANG JIN DA CO., LTD', - target: 'DF4w9KjlJ-A__x_6iWz60Q', - target_type: 'company', - target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', - field: 'ships_to' - }, - { - source: 'ncHocsMhR3-RS3U7yuaNwQ', - source_type: 'company', - source_label: 'MURATA MACHINERY TAIWAN , LTD.', - target: 'DF4w9KjlJ-A__x_6iWz60Q', - target_type: 'company', - target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', - field: 'ships_to' - }, - { - source: 'a1gh_ttb6-W8ut9HgaVYQA', - source_type: 'company', - source_label: 'SHAOXING SKYLAR TRADING CO., LTD', - target: 'DF4w9KjlJ-A__x_6iWz60Q', - target_type: 'company', - target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', - field: 'ships_to' - }, - { - source: 'wbL8s9SNdI94NvqCEqeG7g', - source_type: 'company', - source_label: 'CHANGZHOU ZHANYE CONSTRUCTION', - target: 'DF4w9KjlJ-A__x_6iWz60Q', - target_type: 'company', - target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', - field: 'ships_to' - }, - { - source: '7nI7ZPnQUEQBC1p_j1eWkw', - source_type: 'company', - source_label: 'OPTIMA VENTURES GROUP LIMITED', - target: 'DF4w9KjlJ-A__x_6iWz60Q', - target_type: 'company', - target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', - field: 'ships_to' - }, - { - source: '80PfVG_vuz0JkAjJIhvcLQ', - source_type: 'company', - source_label: 'AIR RICH TRADING DEVELOPMENT LTD', - target: 'DF4w9KjlJ-A__x_6iWz60Q', - target_type: 'company', - target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', - field: 'ships_to' - }, - { - source: 'nzHjdNwA8FjlDhrerUKTQA', - source_type: 'company', - source_label: 'GEENG TYAN ENTERPRISE CO., LTD.', - target: 'DF4w9KjlJ-A__x_6iWz60Q', - target_type: 'company', - target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', - field: 'ships_to' - }, - { - source: 'p2nNlo2SmAdn65QdX8weSA', - source_type: 'company', - source_label: 'TOYO TEXTILE CO LTD', - target: 'DF4w9KjlJ-A__x_6iWz60Q', - target_type: 'company', - target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', - field: 'ships_to' - }, - { - source: 'w790ve0Opp_Oc71h-Ma1SQ', - source_type: 'company', - source_label: 'HONG TAI HIGH NUMERATOR CO., LTD', - target: 'DF4w9KjlJ-A__x_6iWz60Q', - target_type: 'company', - target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', - field: 'ships_to' - }, - { - source: 's3EMkHt64foNbMFhZKsoNA', - source_type: 'company', - source_label: 'CôNG TY TNHH RTI ( VIệT NAM )', - target: 'T4MPSlvIEaYFldsX2xb7fA', - target_type: 'person', - target_label: 'Cty TNHH Dây Khóa Kéo KEEN CHING', - field: 'ships_to' - }, - { - source: 's5WBLgzMhI3KGpCZMchVoQ', - source_type: 'company', - source_label: 'KUNSHAN LITAI FIBER CO., LTD', - target: 's3EMkHt64foNbMFhZKsoNA', - target_type: 'company', - target_label: 'CôNG TY TNHH RTI ( VIệT NAM )', - field: 'ships_to' - }, - { - source: 'rcQyjwf5hkBF9snBWMY8ug', - source_type: 'company', - source_label: 'ARISTO GLOBAL INC.', - target: 's3EMkHt64foNbMFhZKsoNA', - target_type: 'company', - target_label: 'CôNG TY TNHH RTI ( VIệT NAM )', - field: 'ships_to' - }, - { - source: 'KE2fNwJSWT-cmbFI9i76Mg', - source_type: 'company', - source_label: 'OMNITEX INTERNATIONAL CORP.', - target: 's3EMkHt64foNbMFhZKsoNA', - target_type: 'company', - target_label: 'CôNG TY TNHH RTI ( VIệT NAM )', - field: 'ships_to' - }, - { - source: 'BQNENRwoOp6qRYIGgz7HMw', - source_type: 'company', - source_label: 'Công Ty TNHH Một Thành Viên Sơn Hà Duy Xuyên', - target: 'Be1vdQekKL83u9Aq_rEWFw', - target_type: 'company', - target_label: 'ECLAT TEXTILE CO., LTD', - field: 'ships_to' - }, - { - source: 'BY3TWAkWypPYP3p0jhO7kw', - source_type: 'company', - source_label: 'MIEN LI CORP (TAIWAN)', - target: 'BQNENRwoOp6qRYIGgz7HMw', - target_type: 'company', - target_label: 'Công Ty TNHH Một Thành Viên Sơn Hà Duy Xuyên', - field: 'ships_to' - }, - { - source: 'IzrHZn6NKvs0aXGRuoZ36A', - source_type: 'company', - source_label: 'CôNG TY TNHH MộT THàNH VIêN SơN Hà THăNG BìNH', - target: 'BY3TWAkWypPYP3p0jhO7kw', - target_type: 'company', - target_label: 'MIEN LI CORP (TAIWAN)', - field: 'ships_to' - }, - { - source: 'cDn2I1Dhnqj5Nos6xLMQxQ', - source_type: 'company', - source_label: 'DIBELLA B.V.', - target: 'gdAQnpO4Ur8gdyHPPic-3g', - target_type: 'company', - target_label: 'Gul Ahmed Textile Mills Ltd', - field: 'ships_to' - }, - { - source: 'HUjVKQ-aHwTvJ2tlJBY8Og', - source_type: 'company', - source_label: 'M/S A.B. EXPORTS (PVT) LTD,', - target: 'cDn2I1Dhnqj5Nos6xLMQxQ', - target_type: 'company', - target_label: 'DIBELLA B.V.', - field: 'ships_to' - }, - { - source: 'eRnhmbO5WYtDk_LDtJLPgg', - source_type: 'company', - source_label: 'WEISSENGRUBER TEXTIL GMBH,', - target: 'HUjVKQ-aHwTvJ2tlJBY8Og', - target_type: 'company', - target_label: 'M/S A.B. EXPORTS (PVT) LTD,', - field: 'ships_to' - }, - { - source: '2BtDFJ8skgyOhLjtfTud6Q', - source_type: 'company', - source_label: 'ALBASIT EXPORTS', - target: 'eRnhmbO5WYtDk_LDtJLPgg', - target_type: 'company', - target_label: 'WEISSENGRUBER TEXTIL GMBH,', - field: 'ships_to' - }, - { - source: '_UOiaWygi0JqPhJRjbPVTw', - source_type: 'company', - source_label: 'SAPPHIRE TEXTILE SDN BHD', - target: 'HUjVKQ-aHwTvJ2tlJBY8Og', - target_type: 'company', - target_label: 'M/S A.B. EXPORTS (PVT) LTD,', - field: 'ships_to' - }, - { - source: '7xllpuNJ6GomsHewwY44-Q', - source_type: 'company', - source_label: 'M/S SHAMSI INTERNATIONAL (PVT) LTD', - target: '_UOiaWygi0JqPhJRjbPVTw', - target_type: 'company', - target_label: 'SAPPHIRE TEXTILE SDN BHD', - field: 'ships_to' - }, - { - source: '10U5Etnn_K53zndMOlOQcg', - source_type: 'company', - source_label: 'B & D TEXTILES GMBH', - target: 'HUjVKQ-aHwTvJ2tlJBY8Og', - target_type: 'company', - target_label: 'M/S A.B. EXPORTS (PVT) LTD,', - field: 'ships_to' - }, - { - source: 'N1ncemi-0Rp3SIO_XM1KFg', - source_type: 'company', - source_label: 'ARSHAD CORPORATION (PVT) LIMTIED', - target: '10U5Etnn_K53zndMOlOQcg', - target_type: 'company', - target_label: 'B & D TEXTILES GMBH', - field: 'ships_to' - }, - { - source: 'lc7DqhHEOrqnrEPCW5V-lA', - source_type: 'company', - source_label: 'DAGHA TEXTILES (PVT.) LTD.', - target: '10U5Etnn_K53zndMOlOQcg', - target_type: 'company', - target_label: 'B & D TEXTILES GMBH', - field: 'ships_to' - }, - { - source: '1Bo9yl5iFwLyikvHWHyQpQ', - source_type: 'company', - source_label: 'M/S SHAKEEL TEXTILE INDUSTRIES', - target: '10U5Etnn_K53zndMOlOQcg', - target_type: 'company', - target_label: 'B & D TEXTILES GMBH', - field: 'ships_to' - }, - { - source: '7p41-7EcCoOy0b0lI1Io4w', - source_type: 'company', - source_label: 'M/S HASSAN TEXTILES', - target: '10U5Etnn_K53zndMOlOQcg', - target_type: 'company', - target_label: 'B & D TEXTILES GMBH', - field: 'ships_to' - }, - { - source: 'N6gcA1OtXfdql_Hu8DS_Hg', - source_type: 'company', - source_label: 'DAGHA TEXTILES (PVT.) LIMITED', - target: '10U5Etnn_K53zndMOlOQcg', - target_type: 'company', - target_label: 'B & D TEXTILES GMBH', - field: 'ships_to' - }, - { - source: 'CrmtuW83f95ryXiUnmJAhQ', - source_type: 'company', - source_label: 'AL RAHIM TEXTILE INDUSTRIES LIMITED', - target: 'cDn2I1Dhnqj5Nos6xLMQxQ', - target_type: 'company', - target_label: 'DIBELLA B.V.', - field: 'ships_to' - }, - { - source: 'VXhxnqwEsjW59EWgCVbcUw', - source_type: 'company', - source_label: 'MAUI AND SONS', - target: 'CrmtuW83f95ryXiUnmJAhQ', - target_type: 'company', - target_label: 'AL RAHIM TEXTILE INDUSTRIES LIMITED', - field: 'ships_to' - }, - { - source: 'fwYyNPTFUMniLVltbqBSMA', - source_type: 'person', - source_label: 'SAYAM KNIT FAB', - target: 'VXhxnqwEsjW59EWgCVbcUw', - target_type: 'company', - target_label: 'MAUI AND SONS', - field: 'ships_to' - }, - { - source: 'DtTaH8Cg7EVXsuAU8RlbmQ', - source_type: 'company', - source_label: 'MARIS (H.K.) SPORTS GOODS CO.,', - target: 'VXhxnqwEsjW59EWgCVbcUw', - target_type: 'company', - target_label: 'MAUI AND SONS', - field: 'ships_to' - }, - { - source: 'x7MWosNsmNXVl3tZGwT5bg', - source_type: 'company', - source_label: 'J&F HEAD WEAR (SIYANG) CO., LTD', - target: 'VXhxnqwEsjW59EWgCVbcUw', - target_type: 'company', - target_label: 'MAUI AND SONS', - field: 'ships_to' - }, - { - source: 'EKfqm3qSvyXP3uMWNISJtQ', - source_type: 'company', - source_label: 'JINJIANG HONGXING FASHION WEAVING CO., LTD. NO', - target: 'VXhxnqwEsjW59EWgCVbcUw', - target_type: 'company', - target_label: 'MAUI AND SONS', - field: 'ships_to' - }, - { - source: 'f-zE4s0FHt0LPfPCx3lFyw', - source_type: 'company', - source_label: 'NINGBO ZHENGTENG STATIONERY AND CHUN XIAO INDUSTRY ZONE BEILUN', - target: 'VXhxnqwEsjW59EWgCVbcUw', - target_type: 'company', - target_label: 'MAUI AND SONS', - field: 'ships_to' - }, - { - source: 'Jo-LTRhq2cG7pNGvn-EsVA', - source_type: 'company', - source_label: 'NINGBO WAVEDREAM OSIA STATIONERY', - target: 'VXhxnqwEsjW59EWgCVbcUw', - target_type: 'company', - target_label: 'MAUI AND SONS', - field: 'ships_to' - }, - { - source: 'OzA7Nmj7BXyAktspjqJGfg', - source_type: 'company', - source_label: 'NINGBO WAVEDREAM OUTDOOR PRODUCTS CO.,LTD.', - target: 'VXhxnqwEsjW59EWgCVbcUw', - target_type: 'company', - target_label: 'MAUI AND SONS', - field: 'ships_to' - }, - { - source: 'suu3I6k-YKM38bYr99fECg', - source_type: 'company', - source_label: 'BAITAI GROUP LIMITED.', - target: 'VXhxnqwEsjW59EWgCVbcUw', - target_type: 'company', - target_label: 'MAUI AND SONS', - field: 'ships_to' - }, - { - source: 't-zAQNFfSFHGj70zoQ4rbQ', - source_type: 'company', - source_label: 'WUXI LIJING APPAREL CO LTD', - target: 'VXhxnqwEsjW59EWgCVbcUw', - target_type: 'company', - target_label: 'MAUI AND SONS', - field: 'ships_to' - }, - { - source: 'J7zmMyFFV1tW-lJIKiOKhg', - source_type: 'company', - source_label: 'MARIS(H.K)SPORTS GOODS CO.,LIMITED', - target: 'VXhxnqwEsjW59EWgCVbcUw', - target_type: 'company', - target_label: 'MAUI AND SONS', - field: 'ships_to' - }, - { - source: 'gS4dOrYBUxcHtD1JfF48AQ', - source_type: 'company', - source_label: 'SHAOXING VISA-SX IMPORT AND EXPORT', - target: 'VXhxnqwEsjW59EWgCVbcUw', - target_type: 'company', - target_label: 'MAUI AND SONS', - field: 'ships_to' - }, - { - source: 'pCFim5mJwKkzuIR-FEPc5A', - source_type: 'company', - source_label: 'SHAOXING VISA-SX IMPORT AND EXPORT ROOM', - target: 'VXhxnqwEsjW59EWgCVbcUw', - target_type: 'company', - target_label: 'MAUI AND SONS', - field: 'ships_to' - }, - { - source: 'a3HctbpFY_NInQEyIfw4ZQ', - source_type: 'company', - source_label: 'WUXI HUIHUANG GARMENT CO.,LTD RM', - target: 'VXhxnqwEsjW59EWgCVbcUw', - target_type: 'company', - target_label: 'MAUI AND SONS', - field: 'ships_to' - }, - { - source: 'PLgW3xdOuwzSnV1AVDVLEg', - source_type: 'company', - source_label: 'VASEN INTERNATIONAL LTD', - target: 'VXhxnqwEsjW59EWgCVbcUw', - target_type: 'company', - target_label: 'MAUI AND SONS', - field: 'ships_to' - }, - { - source: 'Yh93aIJyM7H30-z3JW29rQ', - source_type: 'company', - source_label: 'NANCHANG KANGYE CLOTHING CO.,LTD.', - target: 'VXhxnqwEsjW59EWgCVbcUw', - target_type: 'company', - target_label: 'MAUI AND SONS', - field: 'ships_to' - }, - { - source: 'xoBwJxNRu-ywDXhQ27O4zQ', - source_type: 'company', - source_label: 'RADIAL INTERNATIONAL LTD. ( UNIT 2 ZIRANI BAZAR,', - target: 'VXhxnqwEsjW59EWgCVbcUw', - target_type: 'company', - target_label: 'MAUI AND SONS', - field: 'ships_to' - }, - { - source: 'qY9kSlLUCBE-PiU4JD7QOQ', - source_type: 'company', - source_label: 'MARIS(H.K)SPORTS GOODS CO.,LIMITED FLAT C', - target: 'VXhxnqwEsjW59EWgCVbcUw', - target_type: 'company', - target_label: 'MAUI AND SONS', - field: 'ships_to' - }, - { - source: '9Ir2xeGZTnwFbp2B6UAXMg', - source_type: 'company', - source_label: 'NANCHANG KANGYE CLOTHING CO.,LTD. CHANG DONG INDUSTRIAL ZONE,', - target: 'VXhxnqwEsjW59EWgCVbcUw', - target_type: 'company', - target_label: 'MAUI AND SONS', - field: 'ships_to' - }, - { - source: 'S9I-YBojGL4hGbAw3pCDvQ', - source_type: 'company', - source_label: 'GUANGZHOU YING TAI PACKING CO.,LTD ROOM', - target: 'VXhxnqwEsjW59EWgCVbcUw', - target_type: 'company', - target_label: 'MAUI AND SONS', - field: 'ships_to' - }, - { - source: 'pAqBOnuxDYCzkYulTlel4w', - source_type: 'company', - source_label: 'ZHEJINAG LEO&JERRY INTERNATIONAL ROOM A', - target: 'VXhxnqwEsjW59EWgCVbcUw', - target_type: 'company', - target_label: 'MAUI AND SONS', - field: 'ships_to' - }, - { - source: '8U_n94QllNedUaHoQKlk4Q', - source_type: 'company', - source_label: 'JINJIANG HONGXING FASHION WEAVING', - target: 'VXhxnqwEsjW59EWgCVbcUw', - target_type: 'company', - target_label: 'MAUI AND SONS', - field: 'ships_to' - }, - { - source: 'XoCPPJ_7kRnLzP7Qxpom6w', - source_type: 'company', - source_label: 'WUXI LIJING APPAREL CO.,LTD RM', - target: 'VXhxnqwEsjW59EWgCVbcUw', - target_type: 'company', - target_label: 'MAUI AND SONS', - field: 'ships_to' - }, - { - source: 'IYO-Sml1WNrIB9SAta9WKA', - source_type: 'company', - source_label: 'NRN FASHION', - target: 'VXhxnqwEsjW59EWgCVbcUw', - target_type: 'company', - target_label: 'MAUI AND SONS', - field: 'ships_to' - }, - { - source: 'us-YXVRb-jqBejotNJSeOg', - source_type: 'company', - source_label: 'LANGSHI GRAMENTS AND WEAVING CO LTD', - target: 'VXhxnqwEsjW59EWgCVbcUw', - target_type: 'company', - target_label: 'MAUI AND SONS', - field: 'ships_to' - }, - { - source: '2_WvXovlFzvuLlB-SxH0VQ', - source_type: 'company', - source_label: 'YONGKANG JACKOK SPORT GOODS ENTERPRISE FENGSHANZUI INDUSTRY', - target: 'VXhxnqwEsjW59EWgCVbcUw', - target_type: 'company', - target_label: 'MAUI AND SONS', - field: 'ships_to' - }, - { - source: 'uHEEPFjo1hGXytZhtO2VMw', - source_type: 'company', - source_label: 'ZHONG QIAN (GZ) AQUATIC SPORTS RM', - target: 'VXhxnqwEsjW59EWgCVbcUw', - target_type: 'company', - target_label: 'MAUI AND SONS', - field: 'ships_to' - }, - { - source: '_gmHn1hbswM9dDk-ChfVig', - source_type: 'company', - source_label: 'LANGSHI GRAMENTS &WEAVING CO.,LTD', - target: 'VXhxnqwEsjW59EWgCVbcUw', - target_type: 'company', - target_label: 'MAUI AND SONS', - field: 'ships_to' - }, - { - source: 'MKU0paYPbq84EZZ8wAUI2A', - source_type: 'company', - source_label: 'LANGSHI GRAMENTS &WEAVING CO.,LTD SANOU INDUSTRIAL ZONE,YINGLIN', - target: 'VXhxnqwEsjW59EWgCVbcUw', - target_type: 'company', - target_label: 'MAUI AND SONS', - field: 'ships_to' - }, - { - source: 'TXqzK158yR_HNsRdp4ZWIQ', - source_type: 'company', - source_label: 'MARIS(H.K)SPORTS GOODS CO.,LIMITED RM', - target: 'VXhxnqwEsjW59EWgCVbcUw', - target_type: 'company', - target_label: 'MAUI AND SONS', - field: 'ships_to' - }, - { - source: '-ys5KWTHG2mym-cf0JAfig', - source_type: 'company', - source_label: 'LANGSHI GRAMENTS WEAVING CO.,LTD JINJIANG', - target: 'VXhxnqwEsjW59EWgCVbcUw', - target_type: 'company', - target_label: 'MAUI AND SONS', - field: 'ships_to' - }, - { - source: '9LprkMjlCamhO12h6G_qKA', - source_type: 'company', - source_label: 'JINJIANG HONGXING FASHION WEAVING NO', - target: 'VXhxnqwEsjW59EWgCVbcUw', - target_type: 'company', - target_label: 'MAUI AND SONS', - field: 'ships_to' - }, - { - source: 'Bxpg-E90vIyRVD5r_gqdNA', - source_type: 'company', - source_label: 'LUCKY TEXTILE MILLS LIMITED', - target: 'cDn2I1Dhnqj5Nos6xLMQxQ', - target_type: 'company', - target_label: 'DIBELLA B.V.', - field: 'ships_to' - }, - { - source: 'w3mbOSsnfEVvAUuRmAfIkw', - source_type: 'company', - source_label: 'MORITO SCOVILL AMERICAS, LLC', - target: 'Bxpg-E90vIyRVD5r_gqdNA', - target_type: 'company', - target_label: 'LUCKY TEXTILE MILLS LIMITED', - field: 'ships_to' - }, - { - source: 'k9yiaeS4EANKlJlZN1qS9Q', - source_type: 'company', - source_label: 'CHANGSHU TONGGAO MARKETING CO LTD', - target: 'w3mbOSsnfEVvAUuRmAfIkw', - target_type: 'company', - target_label: 'MORITO SCOVILL AMERICAS, LLC', - field: 'ships_to' - }, - { - source: '7htrbTtdrjLqKOeY8aRmvg', - source_type: 'company', - source_label: 'OISHI INDUSTRIES VIET NAM CO LTD', - target: 'w3mbOSsnfEVvAUuRmAfIkw', - target_type: 'company', - target_label: 'MORITO SCOVILL AMERICAS, LLC', - field: 'ships_to' - }, - { - source: 'Gn9tAwz1K3vE8CW8vOFCMA', - source_type: 'person', - source_label: 'Chi Nhánh Tổng Công Ty Liksin - Xí Nghiệp Bao Bì Liksin', - target: 'FIdog3J2WSI6M9hRhKVF9A', - target_type: 'company', - target_label: 'CONG TY TNHH GUNZE VIET NAM', - field: 'ships_to' - }, - { - source: 'uhzL27CzUhEp4__oYjuzzw', - source_type: 'company', - source_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', - target: 'Gn9tAwz1K3vE8CW8vOFCMA', - target_type: 'person', - target_label: 'Chi Nhánh Tổng Công Ty Liksin - Xí Nghiệp Bao Bì Liksin', - field: 'ships_to' - }, - { - source: 'uSJzsEbnl7o-eBPBdTwWMQ', - source_type: 'company', - source_label: 'CONG TY TNHH DIEN - DIEN LANH PHUONG DONG', - target: 'uhzL27CzUhEp4__oYjuzzw', - target_type: 'company', - target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', - field: 'ships_to' - }, - { - source: 'prcQUlvKOFtoBtyNBGUNkQ', - source_type: 'company', - source_label: 'CôNG TY TNHH TONY GOLDEN BEES', - target: 'uhzL27CzUhEp4__oYjuzzw', - target_type: 'company', - target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', - field: 'ships_to' - }, - { - source: 'zCKtjZbudfvygUwJNkL8ng', - source_type: 'company', - source_label: 'CONG TY TNHH SAN XUAT - THUONG MAI & DICH VU HD', - target: 'uhzL27CzUhEp4__oYjuzzw', - target_type: 'company', - target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', - field: 'ships_to' - }, - { - source: 'Ue7_6j-AKdfz79pAOJvTDg', - source_type: 'company', - source_label: 'CONG TY TNHH TM DV SX KY THUAT THI CONG CO DIEN LANH SAI GON', - target: 'uhzL27CzUhEp4__oYjuzzw', - target_type: 'company', - target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', - field: 'ships_to' - }, - { - source: 'wXejiXrM2Rxc9zNb52fVJg', - source_type: 'company', - source_label: 'CONG TY TNHH THUONG MAI VA DICH VU ANH VU V N N', - target: 'uhzL27CzUhEp4__oYjuzzw', - target_type: 'company', - target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', - field: 'ships_to' - }, - { - source: 'vtEsCjq2splJwsJfBYX45g', - source_type: 'company', - source_label: 'CONG TY TNHH THUC PHAM HUU CO VIET NAM', - target: 'uhzL27CzUhEp4__oYjuzzw', - target_type: 'company', - target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', - field: 'ships_to' - }, - { - source: 'Hu9sy86JkVmjWLEwO0eBPw', - source_type: 'company', - source_label: 'QINGDAO SHENG ZHI HAN AGRICULTURAL DEVELOPMENT CO., LTD.', - target: 'uhzL27CzUhEp4__oYjuzzw', - target_type: 'company', - target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', - field: 'ships_to' - }, - { - source: 'q8WEQmF3LQZFYQRkZls4lA', - source_type: 'company', - source_label: 'CONG TY CO PHAN DAU TU HOP THANH PHAT', - target: 'uhzL27CzUhEp4__oYjuzzw', - target_type: 'company', - target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', - field: 'ships_to' - }, - { - source: 'ByY-nOHaGpqeCt5WDkq5eQ', - source_type: 'company', - source_label: 'QINGDAO GLAD ENGIEERING TECHNOLOGY', - target: 'uhzL27CzUhEp4__oYjuzzw', - target_type: 'company', - target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', - field: 'ships_to' - }, - { - source: 'LmvEWavRdHzpsmess7wXqA', - source_type: 'company', - source_label: 'CONG TY TNHH EKIDEN VIET NAM', - target: 'uhzL27CzUhEp4__oYjuzzw', - target_type: 'company', - target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', - field: 'ships_to' - }, - { - source: 'IqbzAc9MwbIWHO0fee68aQ', - source_type: 'company', - source_label: 'FRUITSMART', - target: 'uhzL27CzUhEp4__oYjuzzw', - target_type: 'company', - target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', - field: 'ships_to' - }, - { - source: 'BqQyAEdwqU6P_I7sCLFp3A', - source_type: 'person', - source_label: 'CHI NHANH TONG CONG TY LIKSIN - XI NGHIEP BAO BI AN KHANG LIKSIN', - target: 'uhzL27CzUhEp4__oYjuzzw', - target_type: 'company', - target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', - field: 'ships_to' - }, - { - source: 'Wl3rTlfFYn6UQ_p8lowM8Q', - source_type: 'person', - source_label: 'CHI NHANH TONG CONG TY LIKSIN - XI NGHIEP BAO BI LIKSIN', - target: 'uhzL27CzUhEp4__oYjuzzw', - target_type: 'company', - target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', - field: 'ships_to' - }, - { - source: '2yYoYhvhDzd94B1wkUIOMA', - source_type: 'company', - source_label: 'CHI NHANH CONG TY CP DAU THUC VAT TUONG AN - NHA MAY DAU PHU MY', - target: 'uhzL27CzUhEp4__oYjuzzw', - target_type: 'company', - target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', - field: 'ships_to' - }, - { - source: '7cgv3mjIjRZ13wv8cT2Yag', - source_type: 'company', - source_label: 'CÔNG TY TRÁCH NHIỆM HỮU HẠN HO DO', - target: 'uhzL27CzUhEp4__oYjuzzw', - target_type: 'company', - target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', - field: 'ships_to' - }, - { - source: 'RIT8pfvcFkxX_ZdoWilGKA', - source_type: 'company', - source_label: 'ICA S.P.A', - target: 'uhzL27CzUhEp4__oYjuzzw', - target_type: 'company', - target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', - field: 'ships_to' - }, - { - source: 'xPnJLoVG-m9dVlotIZDTeQ', - source_type: 'company', - source_label: 'CôNG TY TNHH AN PHươNG TECHNOLOGY', - target: 'uhzL27CzUhEp4__oYjuzzw', - target_type: 'company', - target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', - field: 'ships_to' - }, - { - source: 'AkcjhIEiNiO-mWUmcnticw', - source_type: 'company', - source_label: 'CONG TY TNHH THUONG MAI DICH VU KY THUAT PHUC SANG MINH', - target: 'uhzL27CzUhEp4__oYjuzzw', - target_type: 'company', - target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', - field: 'ships_to' - }, - { - source: 'VHkFwGrmL5lxeJjnzC61yA', - source_type: 'company', - source_label: 'CÔNG TY TNHH BẢO AN', - target: 'uhzL27CzUhEp4__oYjuzzw', - target_type: 'company', - target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', - field: 'ships_to' - }, - { - source: 'vFLTafXmjp5whVNy6E3s_w', - source_type: 'company', - source_label: 'NOIDA FABCON MACHINES (P) LTD', - target: 'uhzL27CzUhEp4__oYjuzzw', - target_type: 'company', - target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', - field: 'ships_to' - }, - { - source: 'Qu8geiEofMXheLVPlQCAdw', - source_type: 'company', - source_label: 'SURAJ AGIMPEX HOUSE', - target: 'uhzL27CzUhEp4__oYjuzzw', - target_type: 'company', - target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', - field: 'ships_to' - }, - { - source: 'seUhUlovi6ZSnisSmtbZag', - source_type: 'company', - source_label: 'VINAY INDUSTRIES LTD', - target: 'uhzL27CzUhEp4__oYjuzzw', - target_type: 'company', - target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', - field: 'ships_to' - }, - { - source: 'm_aKEiRErMPoOXxJ-z5Qmg', - source_type: 'company', - source_label: 'CONTG TY CO PHAN DAU TU CONG NGHIEP SAI GON', - target: 'uhzL27CzUhEp4__oYjuzzw', - target_type: 'company', - target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', - field: 'ships_to' - }, - { - source: '-e26_QXeiZ_tnPo3fLiPOQ', - source_type: 'company', - source_label: 'ZIBO DEROLA HOUSEWARE.COM', - target: 'uhzL27CzUhEp4__oYjuzzw', - target_type: 'company', - target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', - field: 'ships_to' - }, - { - source: 'OrkIXANS3-VPU-uuSw2PJQ', - source_type: 'company', - source_label: 'CONG TY TNHH THUONG MAI DICH VU LAM GIA PHU', - target: 'uhzL27CzUhEp4__oYjuzzw', - target_type: 'company', - target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', - field: 'ships_to' - }, - { - source: 'hBRLkpW4Kv-C6lWjA6NB3g', - source_type: 'company', - source_label: 'HWA HENG LEE SDN BHD', - target: 'uhzL27CzUhEp4__oYjuzzw', - target_type: 'company', - target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', - field: 'ships_to' - }, - { - source: 'unabDq3OjFNc9QTqU5Csmg', - source_type: 'company', - source_label: 'CONG TY CO PHAN DAU TU PHAT TRIEN SAN XUAT MIEN NAM', - target: 'uhzL27CzUhEp4__oYjuzzw', - target_type: 'company', - target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', - field: 'ships_to' - }, - { - source: 'QBdB0pCd9ktNaLkGSPWSdw', - source_type: 'company', - source_label: 'Công Ty Cổ Phần Đầu Tư Phát Triển Sản Xuất Miền Nam', - target: 'uhzL27CzUhEp4__oYjuzzw', - target_type: 'company', - target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', - field: 'ships_to' - }, - { - source: '4T-hDsY1UmUwiTKPaQovTg', - source_type: 'company', - source_label: 'CONG TY TNHH MOT THANH VIEN MAY DONG GOI Q.A', - target: 'uhzL27CzUhEp4__oYjuzzw', - target_type: 'company', - target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', - field: 'ships_to' - }, - { - source: 'I22NCQpBLwAFzQZOokNGqQ', - source_type: 'company', - source_label: 'CONG TY CO PHAN HUNG PHUONG', - target: 'uhzL27CzUhEp4__oYjuzzw', - target_type: 'company', - target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', - field: 'ships_to' - }, - { - source: '0SiOqPrsFo8_TdA1Y7aqBg', - source_type: 'company', - source_label: 'CÔNG TY CỔ PHẦN CÔNG NGHỆ BIZFONE', - target: 'uhzL27CzUhEp4__oYjuzzw', - target_type: 'company', - target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', - field: 'ships_to' - }, - { - source: 'Uly7G9_wjrYGLFIbgt6Jvg', - source_type: 'company', - source_label: 'CONG TY TNHH TM CO DIEN TU VIETTECH', - target: 'uhzL27CzUhEp4__oYjuzzw', - target_type: 'company', - target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', - field: 'ships_to' - }, - { - source: 'w4SLTlNgEJk8THOLcNuolQ', - source_type: 'company', - source_label: 'CONG TY TNHH THUONG MAI DICH VU XUAT NHAP KHAU GOLDNUTS', - target: 'uhzL27CzUhEp4__oYjuzzw', - target_type: 'company', - target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', - field: 'ships_to' - }, - { - source: '20E5FyKWwxKYMIZXM23myg', - source_type: 'company', - source_label: 'FL USA', - target: 'uhzL27CzUhEp4__oYjuzzw', - target_type: 'company', - target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', - field: 'ships_to' - }, - { - source: 'sMnf1Y7IZqkkQtatFSrc5w', - source_type: 'company', - source_label: 'GRATEFOOD CO', - target: 'uhzL27CzUhEp4__oYjuzzw', - target_type: 'company', - target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', - field: 'ships_to' - }, - { - source: 'P6Wtazq4zHk21NZTgMKiPA', - source_type: 'company', - source_label: 'CONG TY TNHH MOT THANH VIEN CO KHI XAY DUNG NHAT THANH', - target: 'uhzL27CzUhEp4__oYjuzzw', - target_type: 'company', - target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', - field: 'ships_to' - }, - { - source: 'dIm7pEgnwdkhnmcWbNaUnQ', - source_type: 'company', - source_label: 'CÔNG TY TNHH TIẾP VẬN CONTAINER RỒNG ĐỎ', - target: 'uhzL27CzUhEp4__oYjuzzw', - target_type: 'company', - target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', - field: 'ships_to' - }, - { - source: 'CUr9cjpiDfgSPvRyaxNB0Q', - source_type: 'company', - source_label: 'CONG TY TNHH CO KHI - SAN XUAT - THUONG MAI DAI PHUOC HUY', - target: 'uhzL27CzUhEp4__oYjuzzw', - target_type: 'company', - target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', - field: 'ships_to' - }, - { - source: '-v6MQdJSJ_UYS3aae6izRQ', - source_type: 'company', - source_label: 'NUNZIATA TECNOLOGIE AGROALIMENTARI S.R.L.', - target: 'uhzL27CzUhEp4__oYjuzzw', - target_type: 'company', - target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', - field: 'ships_to' - }, - { - source: 'YP0-VaDytSnUBMXmEBWiPA', - source_type: 'company', - source_label: 'OFI', - target: 'uhzL27CzUhEp4__oYjuzzw', - target_type: 'company', - target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', - field: 'ships_to' - }, - { - source: '2D-Mr_wjWBe2TcaChUYZwg', - source_type: 'company', - source_label: 'MAGNA PROCESSING INDUSTRIES (PRIVATE) LIMITED', - target: '10U5Etnn_K53zndMOlOQcg', - target_type: 'company', - target_label: 'B & D TEXTILES GMBH', - field: 'ships_to' - }, - { - source: 'YapOmucDnADGforvDfIlQA', - source_type: 'company', - source_label: 'Crimson Middle East FZ-LLC', - target: '2D-Mr_wjWBe2TcaChUYZwg', - target_type: 'company', - target_label: 'MAGNA PROCESSING INDUSTRIES (PRIVATE) LIMITED', - field: 'ships_to' - }, - { - source: 'KYMPVbdyYDEkSaxAGsX8jw', - source_type: 'company', - source_label: 'M/S CRYSTALLINE CHEMICAL INDUSTRIES (PVT) LTD', - target: 'YapOmucDnADGforvDfIlQA', - target_type: 'company', - target_label: 'Crimson Middle East FZ-LLC', - field: 'ships_to' - }, - { - source: 'lL9wLO3YqbM8nrhfR-rLyg', - source_type: 'company', - source_label: 'ILSHIN VIETNAM CO LTD', - target: 'gdAQnpO4Ur8gdyHPPic-3g', - target_type: 'company', - target_label: 'Gul Ahmed Textile Mills Ltd', - field: 'ships_to' - }, - { - source: '4v2gb4GRgim65mKbz3Rx_Q', - source_type: 'company', - source_label: 'CARGILL INDIA PRIVATE LIMITED', - target: 'lL9wLO3YqbM8nrhfR-rLyg', - target_type: 'company', - target_label: 'ILSHIN VIETNAM CO LTD', - field: 'ships_to' - }, - { - source: 'Zi_kc6HOxUUyQXuztqgq5g', - source_type: 'company', - source_label: 'CARGILL SIAM LIMITED', - target: '4v2gb4GRgim65mKbz3Rx_Q', - target_type: 'company', - target_label: 'CARGILL INDIA PRIVATE LIMITED', - field: 'ships_to' - }, - { - source: 'RxPiKR6MmsefnQwTWioYFQ', - source_type: 'company', - source_label: 'ALLIGATOR AUTOMATIONS', - target: 'Zi_kc6HOxUUyQXuztqgq5g', - target_type: 'company', - target_label: 'CARGILL SIAM LIMITED', - field: 'ships_to' - }, - { - source: 'fntBHHpybQ56CR-7t8B6LQ', - source_type: 'company', - source_label: 'DUNE PACKAGING LTD', - target: 'RxPiKR6MmsefnQwTWioYFQ', - target_type: 'company', - target_label: 'ALLIGATOR AUTOMATIONS', - field: 'ships_to' - }, - { - source: 'veLGjZeYigX6RjXFQcfObw', - source_type: 'company', - source_label: 'Cocelpa Cia De Celulose E Papel Do Parana', - target: 'fntBHHpybQ56CR-7t8B6LQ', - target_type: 'company', - target_label: 'DUNE PACKAGING LTD', - field: 'ships_to' - }, - { - source: 'QGFzdyqmiK0cB9esCA0Asg', - source_type: 'company', - source_label: 'COCELPA CIA DE CELULOSE & PAPEL DO PARANA', - target: 'fntBHHpybQ56CR-7t8B6LQ', - target_type: 'company', - target_label: 'DUNE PACKAGING LTD', - field: 'ships_to' - }, - { - source: 'tXrKwvLwJwT6RaTyeVmtsA', - source_type: 'company', - source_label: 'BUNGE ASIA PTE LTD.', - target: '4v2gb4GRgim65mKbz3Rx_Q', - target_type: 'company', - target_label: 'CARGILL INDIA PRIVATE LIMITED', - field: 'ships_to' - }, - { - source: 'G2fG1hdYBVRax9fLcya8HA', - source_type: 'company', - source_label: 'CôNG TY TNHH KINH DOANH NôNG SảN VIệT NAM', - target: 'tXrKwvLwJwT6RaTyeVmtsA', - target_type: 'company', - target_label: 'BUNGE ASIA PTE LTD.', - field: 'ships_to' - }, - { - source: '_sw5QmIYZcWpIvmqLz8o_w', - source_type: 'company', - source_label: 'KICE INDUSTRIES, INC.', - target: 'G2fG1hdYBVRax9fLcya8HA', - target_type: 'company', - target_label: 'CôNG TY TNHH KINH DOANH NôNG SảN VIệT NAM', - field: 'ships_to' - }, - { - source: '6IbYeD1a_TkU-GIC33s-fw', - source_type: 'company', - source_label: 'DONGGUAN CITY LONGSHENG HARDWAR', - target: '_sw5QmIYZcWpIvmqLz8o_w', - target_type: 'company', - target_label: 'KICE INDUSTRIES, INC.', - field: 'ships_to' - }, - { - source: 'lHZn80ydV-7o77YhYaaZBw', - source_type: 'company', - source_label: 'GOLDEN AGRI INTERNATIONAL PTE LTD', - target: '4v2gb4GRgim65mKbz3Rx_Q', - target_type: 'company', - target_label: 'CARGILL INDIA PRIVATE LIMITED', - field: 'ships_to' - }, - { - source: 'MRVrgZsql7qjNzOrAgETzA', - source_type: 'company', - source_label: 'THE THAL INDUSTRIES CORPORATION LIMITED', - target: 'lHZn80ydV-7o77YhYaaZBw', - target_type: 'company', - target_label: 'GOLDEN AGRI INTERNATIONAL PTE LTD', - field: 'ships_to' - }, - { - source: '8hy5JQaRgCMigrDqeaL9cw', - source_type: 'company', - source_label: 'YOKOGAWA MIDDLE EAST & AFRICA BSC (', - target: 'MRVrgZsql7qjNzOrAgETzA', - target_type: 'company', - target_label: 'THE THAL INDUSTRIES CORPORATION LIMITED', - field: 'ships_to' - }, - { - source: 'heSIwK8lxfqFNi5lbs8xUg', - source_type: 'company', - source_label: 'PANTECH INSTRUMENTS', - target: '8hy5JQaRgCMigrDqeaL9cw', - target_type: 'company', - target_label: 'YOKOGAWA MIDDLE EAST & AFRICA BSC (', - field: 'ships_to' - }, - { - source: 'ZwnshoeI_mJRiGpqQfzcxQ', - source_type: 'company', - source_label: 'Chashma Sugar Mills Limited', - target: 'lHZn80ydV-7o77YhYaaZBw', - target_type: 'company', - target_label: 'GOLDEN AGRI INTERNATIONAL PTE LTD', - field: 'ships_to' - }, - { - source: '2RqxeQQ6eIJGsGws0fHdtA', - source_type: 'company', - source_label: 'BEACON COMMODITIES LTD.', - target: 'ZwnshoeI_mJRiGpqQfzcxQ', - target_type: 'company', - target_label: 'Chashma Sugar Mills Limited', - field: 'ships_to' - }, - { - source: 'LZTGRrF2FjYo3-xGdu_cMg', - source_type: 'company', - source_label: 'FERNS FINE FOODS PRIVATE LIMITED', - target: '2RqxeQQ6eIJGsGws0fHdtA', - target_type: 'company', - target_label: 'BEACON COMMODITIES LTD.', - field: 'ships_to' - }, - { - source: 'NhaDW7gKnsxR14FLOaW3Uw', - source_type: 'company', - source_label: 'BUNGE S.A', - target: '4v2gb4GRgim65mKbz3Rx_Q', - target_type: 'company', - target_label: 'CARGILL INDIA PRIVATE LIMITED', - field: 'ships_to' - }, - { - source: 'BkSvjycUL2nCb2ylImFYEA', - source_type: 'company', - source_label: 'BUNGE PARAGUAY SA', - target: 'NhaDW7gKnsxR14FLOaW3Uw', - target_type: 'company', - target_label: 'BUNGE S.A', - field: 'ships_to' - }, - { - source: 'ilSw6c5Yajm1dS-gXN7CyA', - source_type: 'company', - source_label: 'MACROSOURCE LLC', - target: 'BkSvjycUL2nCb2ylImFYEA', - target_type: 'company', - target_label: 'BUNGE PARAGUAY SA', - field: 'ships_to' - }, - { - source: 'NRlLXs3cy0CUnAL7Q6m0aQ', - source_type: 'company', - source_label: 'ROTEM AMFERT NEGEV WORKS LTD.', - target: 'ilSw6c5Yajm1dS-gXN7CyA', - target_type: 'company', - target_label: 'MACROSOURCE LLC', - field: 'ships_to' - }, - { - source: 'ccDnCZdzGdvbrrPfiX2c1Q', - source_type: 'company', - source_label: 'ZHEJIANG SUNFIT ADVANCED MATERIALS', - target: 'ilSw6c5Yajm1dS-gXN7CyA', - target_type: 'company', - target_label: 'MACROSOURCE LLC', - field: 'ships_to' - }, - { - source: 'L9OJrva_-5HYC6kAedkR4A', - source_type: 'company', - source_label: 'NINGBO HANGJUN INTERNATIONAL', - target: 'ilSw6c5Yajm1dS-gXN7CyA', - target_type: 'company', - target_label: 'MACROSOURCE LLC', - field: 'ships_to' - }, - { - source: '7jsPrGqOLAQ5rtJ5yABrDg', - source_type: 'company', - source_label: '75 SHEVERNOYE SHOSSE 162622 C. CHEREPOVETS, VOLOGDA REGION', - target: 'ilSw6c5Yajm1dS-gXN7CyA', - target_type: 'company', - target_label: 'MACROSOURCE LLC', - field: 'ships_to' - }, - { - source: 'v6mWRXPijyawdp6P3KddMw', - source_type: 'company', - source_label: "JSC ''APATIT'' SEVERNOYE SHOSSE, 75", - target: 'ilSw6c5Yajm1dS-gXN7CyA', - target_type: 'company', - target_label: 'MACROSOURCE LLC', - field: 'ships_to' - }, - { - source: '4VdkgBq6mNdNrrD8Rkp7Qw', - source_type: 'company', - source_label: 'SOLAR TURBINES EAME S.R.O.', - target: 'gdAQnpO4Ur8gdyHPPic-3g', - target_type: 'company', - target_label: 'Gul Ahmed Textile Mills Ltd', - field: 'ships_to' - }, - { - source: '6_mk9wkNvwoaswly1pDvUQ', - source_type: 'company', - source_label: 'OIL AND NATURAL GAS CORPORATION LIMITED', - target: '4VdkgBq6mNdNrrD8Rkp7Qw', - target_type: 'company', - target_label: 'SOLAR TURBINES EAME S.R.O.', - field: 'ships_to' - }, - { - source: 'BXkymLD-EP8oGQzw8pEcYg', - source_type: 'company', - source_label: 'DE NORA WATER TECHNOLOGIES, LLC', - target: '6_mk9wkNvwoaswly1pDvUQ', - target_type: 'company', - target_label: 'OIL AND NATURAL GAS CORPORATION LIMITED', - field: 'ships_to' - }, - { - source: 'Hl2EcfvD9B0UKLsKLHTrbQ', - source_type: 'company', - source_label: 'DE NORA ELETTRODI (SUZHOU) CO LTD', - target: 'BXkymLD-EP8oGQzw8pEcYg', - target_type: 'company', - target_label: 'DE NORA WATER TECHNOLOGIES, LLC', - field: 'ships_to' - }, - { - source: 'AkhPYIzkdy0kRpJvpp-b1A', - source_type: 'company', - source_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', - target: 'Hl2EcfvD9B0UKLsKLHTrbQ', - target_type: 'company', - target_label: 'DE NORA ELETTRODI (SUZHOU) CO LTD', - field: 'ships_to' - }, - { - source: 'i38exTOu9uZWzUc36rhNDQ', - source_type: 'company', - source_label: 'DE NORA DEUTSCHLAND GMBH , INDUSTRIESTRASSE 17 635', - target: 'AkhPYIzkdy0kRpJvpp-b1A', - target_type: 'company', - target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', - field: 'ships_to' - }, - { - source: '-6PBYPVh7xFlQ6NSelGvxA', - source_type: 'company', - source_label: 'WEIFANG BINHAI PETRO- CHEM CO., LTD NO.001001 XIAN', - target: 'AkhPYIzkdy0kRpJvpp-b1A', - target_type: 'company', - target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', - field: 'ships_to' - }, - { - source: '0PR2Cb5xQ4lv7FJ3_z8i8w', - source_type: 'company', - source_label: 'PACIFIC OLEOCHEMICALS SDN. BHD (64175-U) , PLO 285', - target: 'AkhPYIzkdy0kRpJvpp-b1A', - target_type: 'company', - target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', - field: 'ships_to' - }, - { - source: 'TT-AfLoL3VxwbukNEUZNmA', - source_type: 'company', - source_label: 'ADVANCED INDUSTRIAL SUPPLY FZE', - target: 'AkhPYIzkdy0kRpJvpp-b1A', - target_type: 'company', - target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', - field: 'ships_to' - }, - { - source: 'E0wMzPJ28DNPaGizuzU3Aw', - source_type: 'company', - source_label: 'FELDA MARKETING SERVICES SDN. BHD.', - target: 'AkhPYIzkdy0kRpJvpp-b1A', - target_type: 'company', - target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', - field: 'ships_to' - }, - { - source: 'BhyzJT9ITOKURmmgvFMNrw', - source_type: 'company', - source_label: 'INDIX S.R.L. , VIALE RESTELLI 3 - 20124 MILANO ITA', - target: 'AkhPYIzkdy0kRpJvpp-b1A', - target_type: 'company', - target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', - field: 'ships_to' - }, - { - source: 'U05yDL6_DuQ5iKJ_y9orVg', - source_type: 'company', - source_label: 'EINAR WILLUMSEN A/S , ABILDAGER 23-25 2605 BRENDBY', - target: 'AkhPYIzkdy0kRpJvpp-b1A', - target_type: 'company', - target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', - field: 'ships_to' - }, - { - source: 'mRE6Vhqq60KXedNg3tLcSA', - source_type: 'company', - source_label: 'NATURAL OLEOCHEMICALS SDN BHD. , PLO 338, JALAN TE', - target: 'AkhPYIzkdy0kRpJvpp-b1A', - target_type: 'company', - target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', - field: 'ships_to' - }, - { - source: 'VRxaYpmhafLw8u7mCTIRbg', - source_type: 'company', - source_label: 'GUIZHOU REDSTAR DEVELOPING IMPORT& , EXPORT CO.,LT', - target: 'AkhPYIzkdy0kRpJvpp-b1A', - target_type: 'company', - target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', - field: 'ships_to' - }, - { - source: 'ZaGELahXdbePiEB9GFKUoQ', - source_type: 'company', - source_label: 'GUIZHOU REDSTAR DEVELOPING , IMPORT AND EXPORT CO.', - target: 'AkhPYIzkdy0kRpJvpp-b1A', - target_type: 'company', - target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', - field: 'ships_to' - }, - { - source: 'DXyt2riAdby5RMyOmF549Q', - source_type: 'company', - source_label: 'ISTANBUL OZGE MAKINA SAN TIC LTD , STI 19 MAYIS MA', - target: 'AkhPYIzkdy0kRpJvpp-b1A', - target_type: 'company', - target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', - field: 'ships_to' - }, - { - source: 'jQWfEzf_ma9DAa1_clcbJA', - source_type: 'company', - source_label: 'WEIFANG BINHAI PETRO- CHEM CO., LTD , NO.001001 XIA', - target: 'AkhPYIzkdy0kRpJvpp-b1A', - target_type: 'company', - target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', - field: 'ships_to' - }, - { - source: 'PE11z7lEBa9fkGpZFMM8SA', - source_type: 'company', - source_label: 'GIVAUDAN MEA FZE , U.A.E.', - target: 'AkhPYIzkdy0kRpJvpp-b1A', - target_type: 'company', - target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', - field: 'ships_to' - }, - { - source: 'EotulGFZHVjdkzqKf6PDMw', - source_type: 'company', - source_label: 'TRADERICH INTERNATIONAL SDN. BHD.', - target: 'AkhPYIzkdy0kRpJvpp-b1A', - target_type: 'company', - target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', - field: 'ships_to' - }, - { - source: 'G3ExzlsuCUNbSWIk5TWBoQ', - source_type: 'company', - source_label: 'FRUTAROM ETOL D.O.O. , SKOFJA VAS 39 3211 SKOFJA V', - target: 'AkhPYIzkdy0kRpJvpp-b1A', - target_type: 'company', - target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', - field: 'ships_to' - }, - { - source: 'P8IoXQxhzW7mypvYPet6Eg', - source_type: 'person', - source_label: 'AEROSOL MAKINE TEKNOLOJILERI BARIS ELVAN KESME VE', - target: 'AkhPYIzkdy0kRpJvpp-b1A', - target_type: 'company', - target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', - field: 'ships_to' - }, - { - source: 'u77EzCcGCo3kxHqsj64QMA', - source_type: 'company', - source_label: 'IMEX LIMITED RM 905 WORKINGBERG , COMM BLDG,41-47', - target: 'AkhPYIzkdy0kRpJvpp-b1A', - target_type: 'company', - target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', - field: 'ships_to' - }, - { - source: 'IOBmkChDd4KKK5EbOln1wA', - source_type: 'company', - source_label: 'PALM-OLEO SDN BHD , LOT 1245 KUNDANG INDUSTRIAL ES', - target: 'AkhPYIzkdy0kRpJvpp-b1A', - target_type: 'company', - target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', - field: 'ships_to' - }, - { - source: 'BN3PFTbF0dOCIhWGf4MS6g', - source_type: 'company', - source_label: 'EVYP SABUN MALAYSIA SDN BHD', - target: 'AkhPYIzkdy0kRpJvpp-b1A', - target_type: 'company', - target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', - field: 'ships_to' - }, - { - source: 'SouCCM-pSXPTbZhHHn15Zg', - source_type: 'company', - source_label: 'NANTONG TONGJI CO LTD , NO 19 DASHENG ROAD NANTONG', - target: 'AkhPYIzkdy0kRpJvpp-b1A', - target_type: 'company', - target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', - field: 'ships_to' - }, - { - source: 'DrTJoyNpi8qFPtfpuSjMMQ', - source_type: 'company', - source_label: 'SOUTHERN ACIDS INDUSTRIES SDN. BHD. , LEVEL 29, CE', - target: 'AkhPYIzkdy0kRpJvpp-b1A', - target_type: 'company', - target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', - field: 'ships_to' - }, - { - source: 'zX0iUjcA2GoGH3EO10Mgcg', - source_type: 'company', - source_label: 'JIANGXI JINKE INTERNATIONAL TRADE CO ., LTD , ROOM', - target: 'AkhPYIzkdy0kRpJvpp-b1A', - target_type: 'company', - target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', - field: 'ships_to' - }, - { - source: 'nbbne4ljdN8t8Vx2S7RwfA', - source_type: 'company', - source_label: 'AGRISKY CO.,LTD , OFFICE ADDRESS:RM 1203,NO.1 BUIL', - target: 'AkhPYIzkdy0kRpJvpp-b1A', - target_type: 'company', - target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', - field: 'ships_to' - }, - { - source: 'TM_3H_lWy4q255ehpYViCA', - source_type: 'company', - source_label: 'SWISS SINGAPORE , SINGAPROE', - target: 'AkhPYIzkdy0kRpJvpp-b1A', - target_type: 'company', - target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', - field: 'ships_to' - }, - { - source: 'isPIvstXNp3vp2sRrfnS7Q', - source_type: 'company', - source_label: 'PALM-OLEO SDN BHD , LOT 1245, KUNDANG INDUSTRIAL E', - target: 'AkhPYIzkdy0kRpJvpp-b1A', - target_type: 'company', - target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', - field: 'ships_to' - }, - { - source: 'b9wtTcxCY1v0jsq4ihL2WQ', - source_type: 'company', - source_label: 'SUZHOU LONGZHENG PACKAGINGTECHNOLOGY CO.,LTD. 8 W', - target: 'AkhPYIzkdy0kRpJvpp-b1A', - target_type: 'company', - target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', - field: 'ships_to' - }, - { - source: 'Rdpk5v6jYCh7olRvO3jH2g', - source_type: 'company', - source_label: 'MEPLAST PLASTIK TEKNOLOJI SAN VE LT ESENKENT MAH.', - target: 'AkhPYIzkdy0kRpJvpp-b1A', - target_type: 'company', - target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', - field: 'ships_to' - }, - { - source: 'yTkVlCMsfPsyIFIiu9bSEA', - source_type: 'company', - source_label: 'EVYAP SABUN MALAYSIA SDN BHD , PLO 70, JALAN NIBON', - target: 'AkhPYIzkdy0kRpJvpp-b1A', - target_type: 'company', - target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', - field: 'ships_to' - }, - { - source: 'mf4uByHrdlGGtlNgVYIPXA', - source_type: 'company', - source_label: 'ADVANCE INDUSTRIAL SUPPLY FZE , AL COURNICH STR MA', - target: 'AkhPYIzkdy0kRpJvpp-b1A', - target_type: 'company', - target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', - field: 'ships_to' - } -] diff --git a/examples/hierarchy/index.ts b/examples/hierarchy/index.ts index 8eb6b560..c08884f1 100644 --- a/examples/hierarchy/index.ts +++ b/examples/hierarchy/index.ts @@ -132,12 +132,28 @@ const data = [ hierarchy(root, { nodes, edges, options }), hierarchy(root, { nodes, edges, options: { ...options, nodeSize: [100, 300], alignment: 'min' } }), hierarchy(root, { nodes, edges, options: { ...options, nodeSize: [100, 300], alignment: 'max' } }), - hierarchy(root, { nodes, edges, options: { ...options, nodeSize: [50, 600], anchor: 'left', alignment: 'min' } }), + hierarchy(root, { + nodes, + edges, + options: { ...options, nodeSize: [50, 600], anchor: 'left', alignment: 'min', sort: (a, b) => b.height - a.height } + }), hierarchy(root, { nodes, edges, options: { ...options, nodeSize: [50, 600], anchor: 'left', alignment: 'mid' } }), - hierarchy(root, { nodes, edges, options: { ...options, nodeSize: [50, 600], anchor: 'left', alignment: 'max' } }), - hierarchy(root, { nodes, edges, options: { ...options, nodeSize: [50, 600], anchor: 'right', alignment: 'min' } }), + hierarchy(root, { + nodes, + edges, + options: { ...options, nodeSize: [50, 600], anchor: 'left', alignment: 'max', sort: (a, b) => a.height - b.height } + }), + hierarchy(root, { + nodes, + edges, + options: { ...options, nodeSize: [50, 600], anchor: 'right', alignment: 'min', sort: (a, b) => b.height - a.height } + }), hierarchy(root, { nodes, edges, options: { ...options, nodeSize: [50, 600], anchor: 'right', alignment: 'mid' } }), - hierarchy(root, { nodes, edges, options: { ...options, nodeSize: [50, 600], anchor: 'right', alignment: 'max' } }), + hierarchy(root, { + nodes, + edges, + options: { ...options, nodeSize: [50, 600], anchor: 'right', alignment: 'max', sort: (a, b) => a.height - b.height } + }), hierarchy(root, { nodes, edges, options: { ...options, anchor: 'bottom' } }), hierarchy(root, { nodes, edges, options: { ...options, nodeSize: [100, 300], anchor: 'bottom', alignment: 'min' } }), hierarchy(root, { nodes, edges, options: { ...options, nodeSize: [100, 300], anchor: 'bottom', alignment: 'max' } }) From 056670370572ab6b8746f094b524441403510a29 Mon Sep 17 00:00:00 2001 From: Mikey Gower Date: Wed, 20 Sep 2023 11:20:29 -0400 Subject: [PATCH 14/22] tidy-tree example with supply chain data --- examples/index.html | 1 + examples/tidy-tree/data.ts | 3404 +++++++++++++++++++++++++++++++++ examples/tidy-tree/index.html | 24 + examples/tidy-tree/index.ts | 167 ++ 4 files changed, 3596 insertions(+) create mode 100644 examples/tidy-tree/data.ts create mode 100644 examples/tidy-tree/index.html create mode 100644 examples/tidy-tree/index.ts diff --git a/examples/index.html b/examples/index.html index 9414df4d..3663970f 100644 --- a/examples/index.html +++ b/examples/index.html @@ -25,6 +25,7 @@
  • pixi react
  • pixi icons
  • hierarchy
  • +
  • tidy-tree
  • radial
  • collide
  • components
  • diff --git a/examples/tidy-tree/data.ts b/examples/tidy-tree/data.ts new file mode 100644 index 00000000..737aabc4 --- /dev/null +++ b/examples/tidy-tree/data.ts @@ -0,0 +1,3404 @@ +export default [ + { + source: 'i1D5ub-15RRb0Omyik4LMQ', + source_type: 'company', + source_label: 'POUCHEN VIETNAM ENTERPRISE .LTD', + target: '875yxpVvxV2RsweKMRiu7g', + target_type: 'company', + target_label: 'NIKE USA, INC.', + field: 'ships_to' + }, + { + source: 'ghSsFkTP63LNCtklRVteUA', + source_type: 'company', + source_label: 'Công Ty TNHH Đông Tây Tây Nguyên', + target: 'i1D5ub-15RRb0Omyik4LMQ', + target_type: 'company', + target_label: 'POUCHEN VIETNAM ENTERPRISE .LTD', + field: 'ships_to' + }, + { + source: 'JBs_ElZzH-PQIG8Sm3fBaQ', + source_type: 'person', + source_label: 'CONG TY CHANG SHIN VIET NAM TRACH NHIEM HUU HAN', + target: 'ghSsFkTP63LNCtklRVteUA', + target_type: 'company', + target_label: 'Công Ty TNHH Đông Tây Tây Nguyên', + field: 'ships_to' + }, + { + source: 'y4qWGNbfS4u6qB0a_Ztx0w', + source_type: 'company', + source_label: 'CôNG TY TNHH SAMBU FINE VIệT NAM', + target: 'i1D5ub-15RRb0Omyik4LMQ', + target_type: 'company', + target_label: 'POUCHEN VIETNAM ENTERPRISE .LTD', + field: 'ships_to' + }, + { + source: '-g7pbHTY4DWohGGDPGHlSg', + source_type: 'company', + source_label: 'TECHNICK PRODUCTS INC', + target: 'y4qWGNbfS4u6qB0a_Ztx0w', + target_type: 'company', + target_label: 'CôNG TY TNHH SAMBU FINE VIệT NAM', + field: 'ships_to' + }, + { + source: 'POJMUJZTx3tRdR64UUiJJg', + source_type: 'company', + source_label: 'SUNKIST CHEMICAL MACHINERY LTD', + target: 'y4qWGNbfS4u6qB0a_Ztx0w', + target_type: 'company', + target_label: 'CôNG TY TNHH SAMBU FINE VIệT NAM', + field: 'ships_to' + }, + { + source: 'JdWlfTGPr2V9qR8KcTzpqg', + source_type: 'company', + source_label: 'GTM-KOREA', + target: 'y4qWGNbfS4u6qB0a_Ztx0w', + target_type: 'company', + target_label: 'CôNG TY TNHH SAMBU FINE VIệT NAM', + field: 'ships_to' + }, + { + source: '1psWQQT8trJieu_8LaJ1oQ', + source_type: 'company', + source_label: 'NINGBO YONGTAM INTERNATIONAL TRADE CO.,LTD', + target: 'y4qWGNbfS4u6qB0a_Ztx0w', + target_type: 'company', + target_label: 'CôNG TY TNHH SAMBU FINE VIệT NAM', + field: 'ships_to' + }, + { + source: 'PMS7vApODXt0LukTgFeLdg', + source_type: 'company', + source_label: 'CôNG TY TNHH MAXPORT LIMITED (VIET NAM)', + target: '875yxpVvxV2RsweKMRiu7g', + target_type: 'company', + target_label: 'NIKE USA, INC.', + field: 'ships_to' + }, + { + source: '23vQxJdeBrvwq5UgIHOnPw', + source_type: 'company', + source_label: 'ARCTERYX EQUIPMENT', + target: 'PMS7vApODXt0LukTgFeLdg', + target_type: 'company', + target_label: 'CôNG TY TNHH MAXPORT LIMITED (VIET NAM)', + field: 'ships_to' + }, + { + source: 'KiRkgkNcc1g8_tvQ3q-gPQ', + source_type: 'company', + source_label: 'MOL CONSOLIDATION SERVICES FOR AND NYG (VIETNAM) CO.,LTD', + target: '23vQxJdeBrvwq5UgIHOnPw', + target_type: 'company', + target_label: 'ARCTERYX EQUIPMENT', + field: 'ships_to' + }, + { + source: 'Be1vdQekKL83u9Aq_rEWFw', + source_type: 'company', + source_label: 'ECLAT TEXTILE CO., LTD', + target: 'PMS7vApODXt0LukTgFeLdg', + target_type: 'company', + target_label: 'CôNG TY TNHH MAXPORT LIMITED (VIET NAM)', + field: 'ships_to' + }, + { + source: 'R1DOkA8k_SslHRr7d-rW3A', + source_type: 'company', + source_label: 'CôNG TY TRáCH NHIệM HữU HạN THế HUY', + target: 'Be1vdQekKL83u9Aq_rEWFw', + target_type: 'company', + target_label: 'ECLAT TEXTILE CO., LTD', + field: 'ships_to' + }, + { + source: 'aCy376RD81eZW0kjva_hlA', + source_type: 'company', + source_label: 'ASICS EUROPE BV', + target: 'PMS7vApODXt0LukTgFeLdg', + target_type: 'company', + target_label: 'CôNG TY TNHH MAXPORT LIMITED (VIET NAM)', + field: 'ships_to' + }, + { + source: 'BQy4ZlQ4Ba_yxU6EeoR98w', + source_type: 'company', + source_label: 'APL LOGISTICS CO LTD VIETNAM - HAIPH', + target: 'aCy376RD81eZW0kjva_hlA', + target_type: 'company', + target_label: 'ASICS EUROPE BV', + field: 'ships_to' + }, + { + source: '8WWpvOzf3kfMcBDXnM9n6g', + source_type: 'company', + source_label: 'APL LOGISTICS VIETNAM CO LTD', + target: 'aCy376RD81eZW0kjva_hlA', + target_type: 'company', + target_label: 'ASICS EUROPE BV', + field: 'ships_to' + }, + { + source: 'gnj8PTONC4yEeG-OCRHluA', + source_type: 'company', + source_label: 'PT. CHANGSHIN REKSA JAYA', + target: '875yxpVvxV2RsweKMRiu7g', + target_type: 'company', + target_label: 'NIKE USA, INC.', + field: 'ships_to' + }, + { + source: 'dPiJDJTIuGz9yhg4PDWIrg', + source_type: 'company', + source_label: 'Công Ty TNHH Chang Yang Việt Nam', + target: 'gnj8PTONC4yEeG-OCRHluA', + target_type: 'company', + target_label: 'PT. CHANGSHIN REKSA JAYA', + field: 'ships_to' + }, + { + source: 'klHscKfwfgOTEWSG3YC-ig', + source_type: 'company', + source_label: 'EVER BRAVE DEVELOPMENTS LTD TAIWAN BRANCH/ECLIPSE POLYMERS (HK) CO LTD', + target: 'dPiJDJTIuGz9yhg4PDWIrg', + target_type: 'company', + target_label: 'Công Ty TNHH Chang Yang Việt Nam', + field: 'ships_to' + }, + { + source: 'cvCrEjCivX7bNFgIR9-1EA', + source_type: 'company', + source_label: 'COMPUNIC ELECTRONICS CO., LTD.', + target: 'dPiJDJTIuGz9yhg4PDWIrg', + target_type: 'company', + target_label: 'Công Ty TNHH Chang Yang Việt Nam', + field: 'ships_to' + }, + { + source: 'QLeRj9ePjQVmikelvTOMwQ', + source_type: 'company', + source_label: 'LASTING POWER TRADING CO', + target: 'dPiJDJTIuGz9yhg4PDWIrg', + target_type: 'company', + target_label: 'Công Ty TNHH Chang Yang Việt Nam', + field: 'ships_to' + }, + { + source: '5hhhiPzZlqJSJ5BXco5wXA', + source_type: 'company', + source_label: 'MITSUBISHI CORPORATION (HONG KONG) LTD.', + target: 'dPiJDJTIuGz9yhg4PDWIrg', + target_type: 'company', + target_label: 'Công Ty TNHH Chang Yang Việt Nam', + field: 'ships_to' + }, + { + source: 'EkXfcRt7vCjrvBfUoksPkg', + source_type: 'company', + source_label: 'AIMEX INTERNATIONAL TRADING CO LTD', + target: 'dPiJDJTIuGz9yhg4PDWIrg', + target_type: 'company', + target_label: 'Công Ty TNHH Chang Yang Việt Nam', + field: 'ships_to' + }, + { + source: 'H3-64kgougl4rEF6_7J7rw', + source_type: 'company', + source_label: 'QATAR CHEMICAL AND PETROCHEMICAL MARKETING AND DISTRIBUTION (*)', + target: 'dPiJDJTIuGz9yhg4PDWIrg', + target_type: 'company', + target_label: 'Công Ty TNHH Chang Yang Việt Nam', + field: 'ships_to' + }, + { + source: 'E2EZ5I_h_TGoOxlfv9hAjw', + source_type: 'company', + source_label: 'SHUENN JAAN MACHINERY CO., LTD', + target: 'dPiJDJTIuGz9yhg4PDWIrg', + target_type: 'company', + target_label: 'Công Ty TNHH Chang Yang Việt Nam', + field: 'ships_to' + }, + { + source: '9hKkoEBuH6X7cHOPRzE3GQ', + source_type: 'company', + source_label: 'REN FENG LIMITED', + target: 'dPiJDJTIuGz9yhg4PDWIrg', + target_type: 'company', + target_label: 'Công Ty TNHH Chang Yang Việt Nam', + field: 'ships_to' + }, + { + source: 'm6aPsiZTOBdY4WfkNH-BHg', + source_type: 'company', + source_label: 'YULS HK INDUSTRIAL LIMITED', + target: 'dPiJDJTIuGz9yhg4PDWIrg', + target_type: 'company', + target_label: 'Công Ty TNHH Chang Yang Việt Nam', + field: 'ships_to' + }, + { + source: 'cQacKDxiKDfEz9ccVhvNzw', + source_type: 'company', + source_label: 'EVER BRAVE DEVELOPMENTS LTD TAIWAN BRANCH/DINH LU PLASTIC CO., LTD', + target: 'dPiJDJTIuGz9yhg4PDWIrg', + target_type: 'company', + target_label: 'Công Ty TNHH Chang Yang Việt Nam', + field: 'ships_to' + }, + { + source: 'Lzk9y47W4skMWMmCmSaxyw', + source_type: 'company', + source_label: 'Công ty TNHH YOUNG IL Việt Nam', + target: 'gnj8PTONC4yEeG-OCRHluA', + target_type: 'company', + target_label: 'PT. CHANGSHIN REKSA JAYA', + field: 'ships_to' + }, + { + source: '1ebalxTiNs_p4mb5qGAHug', + source_type: 'company', + source_label: 'FGL INTERNATIONAL S. P. A.', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 'pd45w5GqSTUbFZq42JuWKg', + source_type: 'company', + source_label: 'EQUITAN SRL', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 'S-AsctZu-oDuGSumvEc-5A', + source_type: 'person', + source_label: 'LS TONGSANG', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 'olMFadp_CTIgGwXYind68Q', + source_type: 'company', + source_label: 'DONG WOO CHEMTECH CO., LTD', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 'el0Do8um5HrQcUf8rV1G3g', + source_type: 'company', + source_label: 'AC HOTEL BY MARRIOTT BOSTON CLEVELAND CIRCLE', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 'vHau25FEFlzZzTqRVjukIg', + source_type: 'company', + source_label: 'A.T.C ( ASSISTANCE TECHNIQUE ET COMMERCIAL)', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 'fwe-TOC3f0c4c3fSYmFGmA', + source_type: 'company', + source_label: 'A.T.C TANNERY CHEMICALS', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 'knHYjD7bT29xX1lO2kTkxw', + source_type: 'company', + source_label: 'NEO TECH CO.', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: '3nyeedrH62MsXKk2j8YRMA', + source_type: 'company', + source_label: 'BU KYOUNG TEC CO., LTD', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 'VmrMLHCh7NECiXmuc-rkuA', + source_type: 'company', + source_label: 'ALCOVER QUIMICA SL.', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 'NGUZSdZSsvJqD6DBlQdLgw', + source_type: 'company', + source_label: 'SUNG NAM CO., LTD', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 'GNz-vrdyVqflnF-SeOUnbg', + source_type: 'company', + source_label: 'TAEKYUNG TRADING CO.', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 'UlUWhLXO9R64VoCgtiHxWw', + source_type: 'company', + source_label: 'MARIO CAIMI S.R.L', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 'ta2EhlFaGMUF1bTG7LNWqA', + source_type: 'company', + source_label: 'TANKEM-KOREA CO., LTD', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: '282TIh5c-Qq8zfAog6vNag', + source_type: 'company', + source_label: 'TENGDA TECHNOLOGY CO LIMITED', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: '66lUH5a5Zqb7Q9Wpi7T-6Q', + source_type: 'company', + source_label: 'FENCOLOR ITALIA S.R.L', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 'lW3QtemBDSMqiWUe3fIlaQ', + source_type: 'company', + source_label: 'COSO ELECTRONIC TECH CO., LTD', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 'ffAYpBBdqQsmIQBMRPE-RQ', + source_type: 'company', + source_label: 'SOCIETA ESERCIZIO STABILIMENTI NERINI S.R.L', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 'pMqpxrY7mgJSioNgNU1N6Q', + source_type: 'company', + source_label: 'TAE LIM DNC CO., LTD', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: '9ZhgLEuCTs-wW3Orly_odw', + source_type: 'company', + source_label: 'YOUNG IL LEATHER CO.,LTD', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 'WkiZy5SfYgzJOoPteLA1dw', + source_type: 'company', + source_label: 'TURNER SAS', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 'HxoiJEiDhf6pQ4nhi37YRg', + source_type: 'company', + source_label: 'JH CHEM TEC CO.,', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: '-gYlix9xK1eDbGG8qETaEA', + source_type: 'company', + source_label: 'JAGOTECH PAPER GMBH', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 'roQpysn4azNS9pyQ8BTnow', + source_type: 'company', + source_label: 'ZSIVIRA CHEMIE MERK PRIVATE LIMITED', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 'OCyJWvQo-hdat5uJ5o6L8A', + source_type: 'company', + source_label: 'CHEMAX CO.,LTD', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 'x2RLaLir4snyobvYbXIH5w', + source_type: 'company', + source_label: 'HANDOK ONDUSTRIAL CO LTD', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 'Ikhd6ypAyWHq7iIBV9K0pQ', + source_type: 'person', + source_label: 'KATE SPADE', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 'Uv-2t36plCXa7c52M0v7qw', + source_type: 'company', + source_label: 'B&J CO.,LTD', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 'nFKUzoV_gQ3lpIFLeS-l9A', + source_type: 'company', + source_label: 'ITA CHEMICALS ASIA LIMITED', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 'dGYFStdpRWohUUqXGMfBdg', + source_type: 'company', + source_label: 'C & U CO., LTD.', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 'CyHkXmtCQRijTnwCeLA3Qg', + source_type: 'company', + source_label: 'SUNRISE LEATHER (HK) LIMITED', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 't7bfl1xS9SW19CzYwZP8Gg', + source_type: 'company', + source_label: 'C/O PIDILITE IND LTD', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 'XYqMZOqKJIZgc8Cy_3pw4g', + source_type: 'company', + source_label: 'RAINBOW CHEMICAL INDUSTRY LIMITED', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 'T_cvI28I3Fg6T7c__hDK4Q', + source_type: 'company', + source_label: 'HAN DOK INDUSTRIAL CO., LTD', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: '_XYeDy3YYxCDnOhwmB6Sdw', + source_type: 'company', + source_label: 'ZSCHIMMER AND SCHWARZ GMBH AND CO KG', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: '_UB7wBBc4n4MphQt4k7E2Q', + source_type: 'company', + source_label: 'CM TANNERY MACHINES S.P.A', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 'azscCWcJesc1YygnKI9Xdg', + source_type: 'company', + source_label: 'ALPA KOREA CO., LTD', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 'p7igP_hGw3NNHqbAe185Hw', + source_type: 'company', + source_label: 'KDIC CORPORATION', + target: 'Lzk9y47W4skMWMmCmSaxyw', + target_type: 'company', + target_label: 'Công ty TNHH YOUNG IL Việt Nam', + field: 'ships_to' + }, + { + source: 'ElVk9SO-3gvvYo191cSptw', + source_type: 'company', + source_label: 'Công Ty TNHH CHEN TAI (Việt Nam)', + target: 'gnj8PTONC4yEeG-OCRHluA', + target_type: 'company', + target_label: 'PT. CHANGSHIN REKSA JAYA', + field: 'ships_to' + }, + { + source: 'SkGcGAtqs1VCJmjWbBkO_g', + source_type: 'company', + source_label: 'CHEN TAI INTERNATIONAL INVESTMENT CO., LTD. TAIWAN BRANCH (SEYCHELLES)', + target: 'ElVk9SO-3gvvYo191cSptw', + target_type: 'company', + target_label: 'Công Ty TNHH CHEN TAI (Việt Nam)', + field: 'ships_to' + }, + { + source: 'rV-ZrqwTZRsbIqowJkgt8g', + source_type: 'company', + source_label: 'SUZHOU NON-SUCCESS EVERY CORE INTERNATIONAL TRADING CO.,LTD', + target: 'ElVk9SO-3gvvYo191cSptw', + target_type: 'company', + target_label: 'Công Ty TNHH CHEN TAI (Việt Nam)', + field: 'ships_to' + }, + { + source: 'CL11eC3OMS0BS3VCs0nIKA', + source_type: 'company', + source_label: 'SUNRISE PLASTIC LIMITED', + target: 'ElVk9SO-3gvvYo191cSptw', + target_type: 'company', + target_label: 'Công Ty TNHH CHEN TAI (Việt Nam)', + field: 'ships_to' + }, + { + source: '3LX0ZfFNgu8bsqLqUdfuyA', + source_type: 'person', + source_label: 'Cty TNHH Việt Nam Paiho', + target: 'gnj8PTONC4yEeG-OCRHluA', + target_type: 'company', + target_label: 'PT. CHANGSHIN REKSA JAYA', + field: 'ships_to' + }, + { + source: 'qVkukiH_KrMhdhmwT6xeWw', + source_type: 'company', + source_label: 'NANTONG EAST HEPTANOIC MACHINERY CO., LTD', + target: '3LX0ZfFNgu8bsqLqUdfuyA', + target_type: 'person', + target_label: 'Cty TNHH Việt Nam Paiho', + field: 'ships_to' + }, + { + source: 'rAh6nX7kpCEsiaVaBvqhRQ', + source_type: 'company', + source_label: 'HERNG FA INDUSTRIAL CO., LTD', + target: '3LX0ZfFNgu8bsqLqUdfuyA', + target_type: 'person', + target_label: 'Cty TNHH Việt Nam Paiho', + field: 'ships_to' + }, + { + source: 'qlpOYIna_IH3FFT9eL8bfg', + source_type: 'company', + source_label: 'PFT AUTOMA TIONTECHNOLOGY LIMITED', + target: '3LX0ZfFNgu8bsqLqUdfuyA', + target_type: 'person', + target_label: 'Cty TNHH Việt Nam Paiho', + field: 'ships_to' + }, + { + source: '3xmaHtPpxMVyzSuEDlgSLw', + source_type: 'company', + source_label: 'DONGGUAN TINCHIKWAN INTELLIGENT TECHNOLOGY CO., LTD.', + target: '3LX0ZfFNgu8bsqLqUdfuyA', + target_type: 'person', + target_label: 'Cty TNHH Việt Nam Paiho', + field: 'ships_to' + }, + { + source: '50b_fPJAZx21mqIuc3ozhQ', + source_type: 'company', + source_label: 'RENQIU FEIXING TEXTILE MACHINERY CO.,LTD', + target: '3LX0ZfFNgu8bsqLqUdfuyA', + target_type: 'person', + target_label: 'Cty TNHH Việt Nam Paiho', + field: 'ships_to' + }, + { + source: '7Xwsq2GkOKU4mIf8FE5Byg', + source_type: 'company', + source_label: 'CHUN YI YARN TWISTING CO.,LTD', + target: '3LX0ZfFNgu8bsqLqUdfuyA', + target_type: 'person', + target_label: 'Cty TNHH Việt Nam Paiho', + field: 'ships_to' + }, + { + source: 'y1oenfwLluo8usXEn02pMg', + source_type: 'company', + source_label: 'MAERSK LOGISTICS & SERVICES', + target: '875yxpVvxV2RsweKMRiu7g', + target_type: 'company', + target_label: 'NIKE USA, INC.', + field: 'ships_to' + }, + { + source: 'TKhJb22KI31C7fHW6SvGyQ', + source_type: 'person', + source_label: 'PHOENIIX', + target: 'y1oenfwLluo8usXEn02pMg', + target_type: 'company', + target_label: 'MAERSK LOGISTICS & SERVICES', + field: 'ships_to' + }, + { + source: 'jbv17LV73n26wjAXGBZFIw', + source_type: 'company', + source_label: 'DMARK METAL BUTTON COMPANY LIMITED', + target: 'TKhJb22KI31C7fHW6SvGyQ', + target_type: 'person', + target_label: 'PHOENIIX', + field: 'ships_to' + }, + { + source: '9LQYtiQJVqim0V81X0vM4A', + source_type: 'company', + source_label: 'QIDONG QIANFAN NEW MATERIAL CO.,LTD', + target: 'TKhJb22KI31C7fHW6SvGyQ', + target_type: 'person', + target_label: 'PHOENIIX', + field: 'ships_to' + }, + { + source: '7i5mdxfP2AdpzI-iKgQESw', + source_type: 'company', + source_label: 'DAMCO INDIA PRIVATE LIMITED', + target: 'y1oenfwLluo8usXEn02pMg', + target_type: 'company', + target_label: 'MAERSK LOGISTICS & SERVICES', + field: 'ships_to' + }, + { + source: '8UL-H_qWnNnOhZWS-IgbtA', + source_type: 'company', + source_label: 'Maersk Logistics & Services International A/S', + target: '7i5mdxfP2AdpzI-iKgQESw', + target_type: 'company', + target_label: 'DAMCO INDIA PRIVATE LIMITED', + field: 'ships_to' + }, + { + source: 'uqaLfEnnt4FtEAsTuFE4hg', + source_type: 'company', + source_label: 'N.C.JOHN & SONS (P) LTD', + target: '7i5mdxfP2AdpzI-iKgQESw', + target_type: 'company', + target_label: 'DAMCO INDIA PRIVATE LIMITED', + field: 'ships_to' + }, + { + source: 'xADXHpLuOkai9aTnY-496Q', + source_type: 'company', + source_label: 'CHINA ARTS INTERTRANS JIANGSU CO LTD', + target: '7i5mdxfP2AdpzI-iKgQESw', + target_type: 'company', + target_label: 'DAMCO INDIA PRIVATE LIMITED', + field: 'ships_to' + }, + { + source: 'oCKstOgrVbtKFFCt3uafrw', + source_type: 'company', + source_label: 'NINGBO RONGXIN ELECTRIC APPLIANCES CO LTD', + target: '7i5mdxfP2AdpzI-iKgQESw', + target_type: 'company', + target_label: 'DAMCO INDIA PRIVATE LIMITED', + field: 'ships_to' + }, + { + source: '6gYDDgHxQFvOuTnrAU0-fA', + source_type: 'company', + source_label: 'KORMAN SHIPPING CO LTD', + target: 'y1oenfwLluo8usXEn02pMg', + target_type: 'company', + target_label: 'MAERSK LOGISTICS & SERVICES', + field: 'ships_to' + }, + { + source: '92gqinQQjQutkxVVWQsocw', + source_type: 'person', + source_label: 'SFT GONDRAND', + target: '6gYDDgHxQFvOuTnrAU0-fA', + target_type: 'company', + target_label: 'KORMAN SHIPPING CO LTD', + field: 'ships_to' + }, + { + source: 'jio9McDQStiGK81KjYgRLg', + source_type: 'company', + source_label: 'KORMAN INTERNATIONAL CO,LTD', + target: '6gYDDgHxQFvOuTnrAU0-fA', + target_type: 'company', + target_label: 'KORMAN SHIPPING CO LTD', + field: 'ships_to' + }, + { + source: '7bHHKb7AKo0_fnN5SEBZUA', + source_type: 'company', + source_label: 'DAMCO USA INC', + target: 'y1oenfwLluo8usXEn02pMg', + target_type: 'company', + target_label: 'MAERSK LOGISTICS & SERVICES', + field: 'ships_to' + }, + { + source: 'lzwK0JHTDWqHiY5UWKjeLA', + source_type: 'company', + source_label: 'KORMAN SHIPPING CO. LTD SHENZHEN', + target: '7bHHKb7AKo0_fnN5SEBZUA', + target_type: 'company', + target_label: 'DAMCO USA INC', + field: 'ships_to' + }, + { + source: '9ZnnVk4TqK5Hf-lYclVSsg', + source_type: 'company', + source_label: 'MAERSK LOGISTICS & SERVICES JAPAN K.K.', + target: '7bHHKb7AKo0_fnN5SEBZUA', + target_type: 'company', + target_label: 'DAMCO USA INC', + field: 'ships_to' + }, + { + source: 'j3gJpgUWAuPtbTFckbgdDQ', + source_type: 'company', + source_label: 'AMCO INDIA PVT LTD.', + target: '7bHHKb7AKo0_fnN5SEBZUA', + target_type: 'company', + target_label: 'DAMCO USA INC', + field: 'ships_to' + }, + { + source: 'yxMfCncq4TeTgPyZO2NB5Q', + source_type: 'company', + source_label: 'DAMCO CHILE S.A.', + target: '7bHHKb7AKo0_fnN5SEBZUA', + target_type: 'company', + target_label: 'DAMCO USA INC', + field: 'ships_to' + }, + { + source: 'modFk0vIz0mn61-pgr6Z6Q', + source_type: 'company', + source_label: 'DAMCO HONGKONG LTD', + target: '7bHHKb7AKo0_fnN5SEBZUA', + target_type: 'company', + target_label: 'DAMCO USA INC', + field: 'ships_to' + }, + { + source: 'CzlcJF-FpJNlTlvktgvA_Q', + source_type: 'company', + source_label: 'KORMAN SHIPPING COMPANY LIMITED', + target: '7bHHKb7AKo0_fnN5SEBZUA', + target_type: 'company', + target_label: 'DAMCO USA INC', + field: 'ships_to' + }, + { + source: 'HJi9AjE4xFjPrn-oH2E3ag', + source_type: 'company', + source_label: 'PLS USE CODE 42200017952', + target: '7bHHKb7AKo0_fnN5SEBZUA', + target_type: 'company', + target_label: 'DAMCO USA INC', + field: 'ships_to' + }, + { + source: 'etw-jLRUoWCh3WllV7YIig', + source_type: 'company', + source_label: 'DAMCO INDIA PRVIATE LIMITED', + target: '7bHHKb7AKo0_fnN5SEBZUA', + target_type: 'company', + target_label: 'DAMCO USA INC', + field: 'ships_to' + }, + { + source: 'J7HINB6gFsk8mdEXS4T3og', + source_type: 'company', + source_label: 'MAERSK LOGISTICS&SERVICES KOREA L', + target: '7bHHKb7AKo0_fnN5SEBZUA', + target_type: 'company', + target_label: 'DAMCO USA INC', + field: 'ships_to' + }, + { + source: 'JrllVAyPUX1OxrX5ZLmGBw', + source_type: 'company', + source_label: 'MAERSK LOGISTICS&SERVICES MALAYSI JL TANJUNG', + target: '7bHHKb7AKo0_fnN5SEBZUA', + target_type: 'company', + target_label: 'DAMCO USA INC', + field: 'ships_to' + }, + { + source: 'TjF3TvsAhqFe4rpuS-0DTQ', + source_type: 'company', + source_label: 'DAMCO JAPAN K.K.ON BEHALF OF DAMC INTERNATIONAL B.V.', + target: '7bHHKb7AKo0_fnN5SEBZUA', + target_type: 'company', + target_label: 'DAMCO USA INC', + field: 'ships_to' + }, + { + source: 'WHxCa4nldeGKc8y85xs37g', + source_type: 'company', + source_label: 'DAMCO CHINA LIMITED QINGDAO BRANC FLAG SHIP TOWER', + target: '7bHHKb7AKo0_fnN5SEBZUA', + target_type: 'company', + target_label: 'DAMCO USA INC', + field: 'ships_to' + }, + { + source: 'fwqbbCC1N7XZwnmCnCiDMQ', + source_type: 'company', + source_label: 'MAERSK DENMARK A/S', + target: '7bHHKb7AKo0_fnN5SEBZUA', + target_type: 'company', + target_label: 'DAMCO USA INC', + field: 'ships_to' + }, + { + source: 'pnlxkBnofo4peuT4iAcUbQ', + source_type: 'company', + source_label: 'DAMCO JAPAN K.K.ON BEHARLF OF DAM INTERNATIONAL B.V.', + target: '7bHHKb7AKo0_fnN5SEBZUA', + target_type: 'company', + target_label: 'DAMCO USA INC', + field: 'ships_to' + }, + { + source: 'h5XDqmqCRzFp6DvCHGNKlQ', + source_type: 'company', + source_label: 'MAERSK LOGISTICS&SERVICES MALAYSI JALAN TANJUNG A/', + target: '7bHHKb7AKo0_fnN5SEBZUA', + target_type: 'company', + target_label: 'DAMCO USA INC', + field: 'ships_to' + }, + { + source: 'OzUMOsvqzksKySFazxydbA', + source_type: 'company', + source_label: 'MAERSK LOGISTICS AND SERVICES FASCINATIO BOULEVARD', + target: '7bHHKb7AKo0_fnN5SEBZUA', + target_type: 'company', + target_label: 'DAMCO USA INC', + field: 'ships_to' + }, + { + source: 'djsQwFecu4f9jIZJvzq4SQ', + source_type: 'company', + source_label: 'DAMCO JAPAN K.K.', + target: '7bHHKb7AKo0_fnN5SEBZUA', + target_type: 'company', + target_label: 'DAMCO USA INC', + field: 'ships_to' + }, + { + source: 'Z5cZFF_q0M2AODi-JAhShQ', + source_type: 'company', + source_label: 'DAMCO NINGBO BRANCH', + target: '7bHHKb7AKo0_fnN5SEBZUA', + target_type: 'company', + target_label: 'DAMCO USA INC', + field: 'ships_to' + }, + { + source: 'WkwjJmvpNmsAyAnGepN13A', + source_type: 'company', + source_label: 'DAMCO LOGISTICS KOREA LIMITED CRE', + target: '7bHHKb7AKo0_fnN5SEBZUA', + target_type: 'company', + target_label: 'DAMCO USA INC', + field: 'ships_to' + }, + { + source: 'pZqstjq8FWFE5GpYEIUSSA', + source_type: 'company', + source_label: 'FOREWAY LOGISTICS (PVT) LIMITED', + target: '7bHHKb7AKo0_fnN5SEBZUA', + target_type: 'company', + target_label: 'DAMCO USA INC', + field: 'ships_to' + }, + { + source: 'JjVF4dpSylqcnFyCJr8eqA', + source_type: 'company', + source_label: 'DAMCO JAPAN K.K.ON BEHALF OF DAMCO INTERNATIONAL B.V.', + target: '7bHHKb7AKo0_fnN5SEBZUA', + target_type: 'company', + target_label: 'DAMCO USA INC', + field: 'ships_to' + }, + { + source: 'scm8id2LumSm3WJmI4PuOw', + source_type: 'company', + source_label: 'DAMCO LOGISTICS (THAILAND) CO., LTD', + target: '7bHHKb7AKo0_fnN5SEBZUA', + target_type: 'company', + target_label: 'DAMCO USA INC', + field: 'ships_to' + }, + { + source: 'ktipxeIEF55QCzVdbfP7iw', + source_type: 'company', + source_label: 'DAMCO JAPAN K.K.ON BEHALF OF DAMCO INTERNATIONAL B.V.V', + target: '7bHHKb7AKo0_fnN5SEBZUA', + target_type: 'company', + target_label: 'DAMCO USA INC', + field: 'ships_to' + }, + { + source: 'qhv5GINGrrBxMkkvFFNGKw', + source_type: 'company', + source_label: 'KORMAN SHIPPING CO., LTD O/B KORMAN SHIPPING CO., LTD', + target: '7bHHKb7AKo0_fnN5SEBZUA', + target_type: 'company', + target_label: 'DAMCO USA INC', + field: 'ships_to' + }, + { + source: 'NGYfJrPKZgrZxL3yoUciAA', + source_type: 'company', + source_label: 'DAMCO PAKISTAN PVT LIMITED', + target: '7bHHKb7AKo0_fnN5SEBZUA', + target_type: 'company', + target_label: 'DAMCO USA INC', + field: 'ships_to' + }, + { + source: 'i3lfIFMMirriZOMlqgCPcw', + source_type: 'company', + source_label: 'MAERS ITALIA SPA', + target: '7bHHKb7AKo0_fnN5SEBZUA', + target_type: 'company', + target_label: 'DAMCO USA INC', + field: 'ships_to' + }, + { + source: 'Z_R3Ol2j_-dsOM7UuH3PTw', + source_type: 'company', + source_label: 'PT. KANINDO MAKMUR JAYA', + target: '875yxpVvxV2RsweKMRiu7g', + target_type: 'company', + target_label: 'NIKE USA, INC.', + field: 'ships_to' + }, + { + source: 'gdAQnpO4Ur8gdyHPPic-3g', + source_type: 'company', + source_label: 'Gul Ahmed Textile Mills Ltd', + target: 'Z_R3Ol2j_-dsOM7UuH3PTw', + target_type: 'company', + target_label: 'PT. KANINDO MAKMUR JAYA', + field: 'ships_to' + }, + { + source: 'zZ7Ld4jfxffrjb-c-uMCLg', + source_type: 'company', + source_label: 'SLC AGRICOLA S.A. -', + target: 'gdAQnpO4Ur8gdyHPPic-3g', + target_type: 'company', + target_label: 'Gul Ahmed Textile Mills Ltd', + field: 'ships_to' + }, + { + source: 'EbYkwTlltxKm93aFmwnr6Q', + source_type: 'company', + source_label: 'SLC AGRICOLA S.A. FAZENDA PANTANAL II ROD GO', + target: 'zZ7Ld4jfxffrjb-c-uMCLg', + target_type: 'company', + target_label: 'SLC AGRICOLA S.A. -', + field: 'ships_to' + }, + { + source: '4O7oZmLCm_z8wPLBTuKi4Q', + source_type: 'company', + source_label: 'SCHRODER & VOGEL GMBH', + target: 'gdAQnpO4Ur8gdyHPPic-3g', + target_type: 'company', + target_label: 'Gul Ahmed Textile Mills Ltd', + field: 'ships_to' + }, + { + source: '8PupZUriUI4omSKa4ayzNg', + source_type: 'company', + source_label: 'AVANEETHA TEXTILES (P) LTD', + target: '4O7oZmLCm_z8wPLBTuKi4Q', + target_type: 'company', + target_label: 'SCHRODER & VOGEL GMBH', + field: 'ships_to' + }, + { + source: 'mmUw3_AOYrgtiPEBoOZsZw', + source_type: 'company', + source_label: 'ООО "KHUMOYUN IMPEX', + target: '4O7oZmLCm_z8wPLBTuKi4Q', + target_type: 'company', + target_label: 'SCHRODER & VOGEL GMBH', + field: 'ships_to' + }, + { + source: 'EvLGfej9wOebHSyBAAiL5g', + source_type: 'company', + source_label: 'LX PANTOS', + target: 'gdAQnpO4Ur8gdyHPPic-3g', + target_type: 'company', + target_label: 'Gul Ahmed Textile Mills Ltd', + field: 'ships_to' + }, + { + source: 'vlC_1_swUfhdF1O1If7TiA', + source_type: 'person', + source_label: 'HANKOOK', + target: 'EvLGfej9wOebHSyBAAiL5g', + target_type: 'company', + target_label: 'LX PANTOS', + field: 'ships_to' + }, + { + source: '099K6W_pvK-sIPVA19cszQ', + source_type: 'person', + source_label: 'HYOSUNG', + target: 'EvLGfej9wOebHSyBAAiL5g', + target_type: 'company', + target_label: 'LX PANTOS', + field: 'ships_to' + }, + { + source: 'QK8hpg_GKeDHhKekrLIMVQ', + source_type: 'company', + source_label: 'LACHESIS CO., LTD.', + target: 'EvLGfej9wOebHSyBAAiL5g', + target_type: 'company', + target_label: 'LX PANTOS', + field: 'ships_to' + }, + { + source: 'pTOw8gwcz3cJLiUdDfOmyQ', + source_type: 'company', + source_label: 'LX PANTOS VIETNAM CO., LTD', + target: 'EvLGfej9wOebHSyBAAiL5g', + target_type: 'company', + target_label: 'LX PANTOS', + field: 'ships_to' + }, + { + source: 'KD3kWoMGPiIvEIF6h1t_eA', + source_type: 'company', + source_label: 'SUL DE MINAS INGREDIENTES LTDA', + target: 'EvLGfej9wOebHSyBAAiL5g', + target_type: 'company', + target_label: 'LX PANTOS', + field: 'ships_to' + }, + { + source: 'Ltq9E3IL6c6UnVkm1rM1nQ', + source_type: 'company', + source_label: 'SOUTHCO INDIA PVT. LTD.', + target: 'EvLGfej9wOebHSyBAAiL5g', + target_type: 'company', + target_label: 'LX PANTOS', + field: 'ships_to' + }, + { + source: 'fBQL7wJqTbrgqP7gEEeDZA', + source_type: 'company', + source_label: 'DSV', + target: 'EvLGfej9wOebHSyBAAiL5g', + target_type: 'company', + target_label: 'LX PANTOS', + field: 'ships_to' + }, + { + source: 'dZqUiB2HNHWfA3H7N5c-8w', + source_type: 'company', + source_label: 'Pt Lx Pantos Indonesia Kawasan Industries', + target: 'EvLGfej9wOebHSyBAAiL5g', + target_type: 'company', + target_label: 'LX PANTOS', + field: 'ships_to' + }, + { + source: 'lfPRFv_D4br8MHICrmd2gw', + source_type: 'company', + source_label: 'LG MMA CORP.', + target: 'EvLGfej9wOebHSyBAAiL5g', + target_type: 'company', + target_label: 'LX PANTOS', + field: 'ships_to' + }, + { + source: '_ZzYVj4PdLNbJPzki4XezQ', + source_type: 'company', + source_label: 'HANAM TEXTILE COMPANY', + target: 'gdAQnpO4Ur8gdyHPPic-3g', + target_type: 'company', + target_label: 'Gul Ahmed Textile Mills Ltd', + field: 'ships_to' + }, + { + source: 'H1oGJI-KX28MqOtTHEI85g', + source_type: 'person', + source_label: 'KAIPAA BOBBINS', + target: '_ZzYVj4PdLNbJPzki4XezQ', + target_type: 'company', + target_label: 'HANAM TEXTILE COMPANY', + field: 'ships_to' + }, + { + source: '1q-qiAkgeyZO0ssY4DpjhQ', + source_type: 'company', + source_label: 'SOJITZ MACHINERY CORPORATION', + target: 'gdAQnpO4Ur8gdyHPPic-3g', + target_type: 'company', + target_label: 'Gul Ahmed Textile Mills Ltd', + field: 'ships_to' + }, + { + source: 'jLfkcSklnWQtzH-yaXc8uA', + source_type: 'company', + source_label: 'RABA AXLE LTD.', + target: '1q-qiAkgeyZO0ssY4DpjhQ', + target_type: 'company', + target_label: 'SOJITZ MACHINERY CORPORATION', + field: 'ships_to' + }, + { + source: 'LPZs073A_H5EulXLDd_1Kw', + source_type: 'company', + source_label: 'SOJITZ MACHINERY CORPORATION TOKYO JAPAN', + target: '1q-qiAkgeyZO0ssY4DpjhQ', + target_type: 'company', + target_label: 'SOJITZ MACHINERY CORPORATION', + field: 'ships_to' + }, + { + source: 'OpEGnhUpyCVn-yMSePlE7A', + source_type: 'company', + source_label: 'Công Ty TNHH Dệt Hà Nam', + target: 'gdAQnpO4Ur8gdyHPPic-3g', + target_type: 'company', + target_label: 'Gul Ahmed Textile Mills Ltd', + field: 'ships_to' + }, + { + source: 'H5XitINIykLkxgs7FMD1AA', + source_type: 'company', + source_label: 'GOETZ AND SONS INCORPORATED', + target: 'OpEGnhUpyCVn-yMSePlE7A', + target_type: 'company', + target_label: 'Công Ty TNHH Dệt Hà Nam', + field: 'ships_to' + }, + { + source: 'lgARqBIT3_GcZHCfPnMiKQ', + source_type: 'company', + source_label: 'OLAM AGRI AMERICAS, INC', + target: 'gdAQnpO4Ur8gdyHPPic-3g', + target_type: 'company', + target_label: 'Gul Ahmed Textile Mills Ltd', + field: 'ships_to' + }, + { + source: 'TRIkUPL6azccXaXVccbGSw', + source_type: 'person', + source_label: 'OLAM COTTON', + target: 'lgARqBIT3_GcZHCfPnMiKQ', + target_type: 'company', + target_label: 'OLAM AGRI AMERICAS, INC', + field: 'ships_to' + }, + { + source: 'sW89C-PdVENsoNtUluXeaw', + source_type: 'company', + source_label: 'OLAM GLOBAL AGRI PERU SAC', + target: 'lgARqBIT3_GcZHCfPnMiKQ', + target_type: 'company', + target_label: 'OLAM AGRI AMERICAS, INC', + field: 'ships_to' + }, + { + source: 'arSWN-foFbT4_jtNYGC2Lw', + source_type: 'company', + source_label: 'LEXZAU, SCHARBAU GMBH & CO KG', + target: 'gdAQnpO4Ur8gdyHPPic-3g', + target_type: 'company', + target_label: 'Gul Ahmed Textile Mills Ltd', + field: 'ships_to' + }, + { + source: 'P1OojSELZIuszlGgNwwDsg', + source_type: 'company', + source_label: 'LESCHACO KOREA O/B OF', + target: 'arSWN-foFbT4_jtNYGC2Lw', + target_type: 'company', + target_label: 'LEXZAU, SCHARBAU GMBH & CO KG', + field: 'ships_to' + }, + { + source: 'I5BydauAUgAkNqkQ_T0ztQ', + source_type: 'company', + source_label: 'LESCHACO (CHINA) LIMITED NINGBO', + target: 'arSWN-foFbT4_jtNYGC2Lw', + target_type: 'company', + target_label: 'LEXZAU, SCHARBAU GMBH & CO KG', + field: 'ships_to' + }, + { + source: '_GePUmQxC3NJjmHpKJXyPQ', + source_type: 'company', + source_label: 'MOL CONSOLIDATION SERVICE LTD', + target: '23vQxJdeBrvwq5UgIHOnPw', + target_type: 'company', + target_label: 'ARCTERYX EQUIPMENT', + field: 'ships_to' + }, + { + source: 'hzIaFKpm5qTSQ4OcY_bceg', + source_type: 'company', + source_label: 'MOL CONSOLIDATION SERVICE LIMITED', + target: '_GePUmQxC3NJjmHpKJXyPQ', + target_type: 'company', + target_label: 'MOL CONSOLIDATION SERVICE LTD', + field: 'ships_to' + }, + { + source: 'aT8JFtKy9tIEADYpCJbbAw', + source_type: 'company', + source_label: 'MOL CONSOLIDATION SERVICE LIMITED SHENZHEN BRANCH', + target: 'hzIaFKpm5qTSQ4OcY_bceg', + target_type: 'company', + target_label: 'MOL CONSOLIDATION SERVICE LIMITED', + field: 'ships_to' + }, + { + source: 'uabqIP8ejN2B3fhAHuJwTA', + source_type: 'company', + source_label: 'BRANCH OF MOL CONSOLIDATION SERVICE LIMITED', + target: 'hzIaFKpm5qTSQ4OcY_bceg', + target_type: 'company', + target_label: 'MOL CONSOLIDATION SERVICE LIMITED', + field: 'ships_to' + }, + { + source: 'w5jyY5NtgVKAF8iBo7zjiQ', + source_type: 'company', + source_label: 'MOL CONSOLIDATION SERVICE (VIETNAM) CO.,LTD', + target: 'hzIaFKpm5qTSQ4OcY_bceg', + target_type: 'company', + target_label: 'MOL CONSOLIDATION SERVICE LIMITED', + field: 'ships_to' + }, + { + source: '_Kvu9lxrQOFVFBWWX2nJDw', + source_type: 'company', + source_label: 'YOUNGONE (CEPZ) LTD', + target: '23vQxJdeBrvwq5UgIHOnPw', + target_type: 'company', + target_label: 'ARCTERYX EQUIPMENT', + field: 'ships_to' + }, + { + source: '6VExO6TrtSDHnGcoGTEcMQ', + source_type: 'company', + source_label: 'KRISHNA LAMICOAT PRIVATE LIMITED', + target: '_Kvu9lxrQOFVFBWWX2nJDw', + target_type: 'company', + target_label: 'YOUNGONE (CEPZ) LTD', + field: 'ships_to' + }, + { + source: 'tIv1JANDINjyzYpogb4h_A', + source_type: 'company', + source_label: 'DNZ RESOURCES FZC', + target: '6VExO6TrtSDHnGcoGTEcMQ', + target_type: 'company', + target_label: 'KRISHNA LAMICOAT PRIVATE LIMITED', + field: 'ships_to' + }, + { + source: 'M3l5NgAY8qkoaVrul793hQ', + source_type: 'company', + source_label: 'QADRI GLOBAL INC', + target: '6VExO6TrtSDHnGcoGTEcMQ', + target_type: 'company', + target_label: 'KRISHNA LAMICOAT PRIVATE LIMITED', + field: 'ships_to' + }, + { + source: 'QzlmPuewCXCPeVWjckn56g', + source_type: 'company', + source_label: 'CHAMPION MACHINERY MANUFACTURING COMPANY', + target: '6VExO6TrtSDHnGcoGTEcMQ', + target_type: 'company', + target_label: 'KRISHNA LAMICOAT PRIVATE LIMITED', + field: 'ships_to' + }, + { + source: 'IOXeV8184hZua3rWOC48Iw', + source_type: 'company', + source_label: 'UMLENSKI EOOD VAT BG', + target: '6VExO6TrtSDHnGcoGTEcMQ', + target_type: 'company', + target_label: 'KRISHNA LAMICOAT PRIVATE LIMITED', + field: 'ships_to' + }, + { + source: 'JDn867-zbtF-5jmGhCZYWA', + source_type: 'company', + source_label: 'Công Ty TNHH Sơn Hà', + target: 'Be1vdQekKL83u9Aq_rEWFw', + target_type: 'company', + target_label: 'ECLAT TEXTILE CO., LTD', + field: 'ships_to' + }, + { + source: 'xxfi95LpHIhVJnfKaudYBQ', + source_type: 'company', + source_label: 'RUSHAN LONGMA GARMENT CO.,LTD', + target: 'JDn867-zbtF-5jmGhCZYWA', + target_type: 'company', + target_label: 'Công Ty TNHH Sơn Hà', + field: 'ships_to' + }, + { + source: '4Jkdon6XCOev7AUsJ1HOmw', + source_type: 'company', + source_label: 'CôNG TY TNHH ĐầU Tư Và PHáT TRIểN MINH QUANG VINA', + target: 'xxfi95LpHIhVJnfKaudYBQ', + target_type: 'company', + target_label: 'RUSHAN LONGMA GARMENT CO.,LTD', + field: 'ships_to' + }, + { + source: 'e8ES2_QBlXRGTdJQIbnFgQ', + source_type: 'company', + source_label: 'VINEX, SPOL. S.R.O.', + target: 'JDn867-zbtF-5jmGhCZYWA', + target_type: 'company', + target_label: 'Công Ty TNHH Sơn Hà', + field: 'ships_to' + }, + { + source: 'DM194iFyiENALb5Cs8U8-w', + source_type: 'company', + source_label: 'CôNG TY TNHH MAY MặC XUấT NHậP KHẩU GALAXY VINA', + target: 'e8ES2_QBlXRGTdJQIbnFgQ', + target_type: 'company', + target_label: 'VINEX, SPOL. S.R.O.', + field: 'ships_to' + }, + { + source: 'FIdog3J2WSI6M9hRhKVF9A', + source_type: 'company', + source_label: 'CONG TY TNHH GUNZE VIET NAM', + target: 'JDn867-zbtF-5jmGhCZYWA', + target_type: 'company', + target_label: 'Công Ty TNHH Sơn Hà', + field: 'ships_to' + }, + { + source: 'UmRoeP24T-CTActOKg8BRg', + source_type: 'person', + source_label: 'Cty TNHH Phước Lộc Thành', + target: 'FIdog3J2WSI6M9hRhKVF9A', + target_type: 'company', + target_label: 'CONG TY TNHH GUNZE VIET NAM', + field: 'ships_to' + }, + { + source: 'lB6DP6_wC1yypC1zjq9gBg', + source_type: 'company', + source_label: 'CONG TY TNHH SAN XUAT - THUONG MAI - DICH VU PHUOC TAM HANG', + target: 'FIdog3J2WSI6M9hRhKVF9A', + target_type: 'company', + target_label: 'CONG TY TNHH GUNZE VIET NAM', + field: 'ships_to' + }, + { + source: 'WrbZrvUVD8JLAv5s-CaGBw', + source_type: 'company', + source_label: 'CÔNG TY TNHH MỘT THÀNH VIÊN MAY MẶC VĨNH MAI', + target: 'FIdog3J2WSI6M9hRhKVF9A', + target_type: 'company', + target_label: 'CONG TY TNHH GUNZE VIET NAM', + field: 'ships_to' + }, + { + source: 'WinIZgxQHnKrznqrw8ON8Q', + source_type: 'company', + source_label: 'Công Ty TNHH DV TM SX Hưng Thịnh Lợi', + target: 'FIdog3J2WSI6M9hRhKVF9A', + target_type: 'company', + target_label: 'CONG TY TNHH GUNZE VIET NAM', + field: 'ships_to' + }, + { + source: 'wyFBznHrsnRV5s3FvlZI6g', + source_type: 'company', + source_label: 'CONG TY TNHH SAN XUAT THUONG MAI KY THUAT BAO CHAU', + target: 'FIdog3J2WSI6M9hRhKVF9A', + target_type: 'company', + target_label: 'CONG TY TNHH GUNZE VIET NAM', + field: 'ships_to' + }, + { + source: 'tih_qbrqJ6bPL2D2P1rc_A', + source_type: 'company', + source_label: 'Công Ty TNHH May Nhật Tân', + target: 'FIdog3J2WSI6M9hRhKVF9A', + target_type: 'company', + target_label: 'CONG TY TNHH GUNZE VIET NAM', + field: 'ships_to' + }, + { + source: '7cb3OqbKZ4PSKp1d67nX6A', + source_type: 'company', + source_label: 'Công Ty TNHH Sản Xuất Xuất Nhập Khẩu Tường Đức Phú', + target: 'FIdog3J2WSI6M9hRhKVF9A', + target_type: 'company', + target_label: 'CONG TY TNHH GUNZE VIET NAM', + field: 'ships_to' + }, + { + source: 'MAS-5HBaH8KxjI3zMsborA', + source_type: 'company', + source_label: 'CONG TY TNHH KY THUAT HM TECH', + target: 'FIdog3J2WSI6M9hRhKVF9A', + target_type: 'company', + target_label: 'CONG TY TNHH GUNZE VIET NAM', + field: 'ships_to' + }, + { + source: 'L8RQOFDgCLWQVub-xS5xIQ', + source_type: 'company', + source_label: 'IFG CORPORATION', + target: 'JDn867-zbtF-5jmGhCZYWA', + target_type: 'company', + target_label: 'Công Ty TNHH Sơn Hà', + field: 'ships_to' + }, + { + source: 'ogw_dCjnIUUydVhDXVlI2g', + source_type: 'company', + source_label: 'MINH ANH KIM LIEN GARMENT JSC', + target: 'L8RQOFDgCLWQVub-xS5xIQ', + target_type: 'company', + target_label: 'IFG CORPORATION', + field: 'ships_to' + }, + { + source: 'SNm-deybr6-NcCWokeFMtQ', + source_type: 'company', + source_label: 'M U FASHION LTD', + target: 'L8RQOFDgCLWQVub-xS5xIQ', + target_type: 'company', + target_label: 'IFG CORPORATION', + field: 'ships_to' + }, + { + source: '8IHwQjOzOSrQTeoZIhXCrw', + source_type: 'company', + source_label: 'NLZ FASHION LTD', + target: 'L8RQOFDgCLWQVub-xS5xIQ', + target_type: 'company', + target_label: 'IFG CORPORATION', + field: 'ships_to' + }, + { + source: '-A29KkCVo7oQpgDtvJQ4DA', + source_type: 'company', + source_label: 'AMIR SHIRTS LTD', + target: 'L8RQOFDgCLWQVub-xS5xIQ', + target_type: 'company', + target_label: 'IFG CORPORATION', + field: 'ships_to' + }, + { + source: 'Kh6seN1Xl9gqB3_S9aD-7w', + source_type: 'company', + source_label: 'RDM APPARELS LIMITED', + target: 'L8RQOFDgCLWQVub-xS5xIQ', + target_type: 'company', + target_label: 'IFG CORPORATION', + field: 'ships_to' + }, + { + source: 'cjEvV-YXZMO3sbSLLJA3zA', + source_type: 'company', + source_label: 'TOP ROYAL FLASH VIETNAM CO., LTD', + target: 'L8RQOFDgCLWQVub-xS5xIQ', + target_type: 'company', + target_label: 'IFG CORPORATION', + field: 'ships_to' + }, + { + source: 'MuzgULAMahYnpyFRrGCXcw', + source_type: 'company', + source_label: 'SIRINA GARMENTS AND TEXTILE LTD', + target: 'L8RQOFDgCLWQVub-xS5xIQ', + target_type: 'company', + target_label: 'IFG CORPORATION', + field: 'ships_to' + }, + { + source: 'AHxUxxuosfh9J_UO2zTCyw', + source_type: 'company', + source_label: 'KATTALI TEXTILE LIMITED', + target: 'L8RQOFDgCLWQVub-xS5xIQ', + target_type: 'company', + target_label: 'IFG CORPORATION', + field: 'ships_to' + }, + { + source: '88KZYTmhJ-AqaXUhIYsY2w', + source_type: 'company', + source_label: 'BYZID APPARELS (PVT) LTD', + target: 'L8RQOFDgCLWQVub-xS5xIQ', + target_type: 'company', + target_label: 'IFG CORPORATION', + field: 'ships_to' + }, + { + source: 'LUgBwgjbrtp-ETTEMwzaIQ', + source_type: 'company', + source_label: 'NEW ASIA FASHIONS LIMITED', + target: 'L8RQOFDgCLWQVub-xS5xIQ', + target_type: 'company', + target_label: 'IFG CORPORATION', + field: 'ships_to' + }, + { + source: 'Bu_3SPz-vgiOZtnrtv5n3g', + source_type: 'company', + source_label: 'FARMIN FASHION DESIGN LTD', + target: 'L8RQOFDgCLWQVub-xS5xIQ', + target_type: 'company', + target_label: 'IFG CORPORATION', + field: 'ships_to' + }, + { + source: 'YQbR1WKYZKJeFXUf6uv5oQ', + source_type: 'company', + source_label: 'HOA DO 3 CO., LTD.', + target: 'L8RQOFDgCLWQVub-xS5xIQ', + target_type: 'company', + target_label: 'IFG CORPORATION', + field: 'ships_to' + }, + { + source: 'Qesp_rhWD1IANk6UWTRlfQ', + source_type: 'company', + source_label: 'FARMIN APPARELS LIMITED', + target: 'L8RQOFDgCLWQVub-xS5xIQ', + target_type: 'company', + target_label: 'IFG CORPORATION', + field: 'ships_to' + }, + { + source: 'lpgy8uwv8eG_Dl4qspRYDw', + source_type: 'company', + source_label: 'INDEPENDENT APPARELS LIMITED', + target: 'L8RQOFDgCLWQVub-xS5xIQ', + target_type: 'company', + target_label: 'IFG CORPORATION', + field: 'ships_to' + }, + { + source: 'zW_nydyIm8O3VD33pe0o0Q', + source_type: 'company', + source_label: 'CôNG TY TNHH NGUồN á CHâU', + target: 'Be1vdQekKL83u9Aq_rEWFw', + target_type: 'company', + target_label: 'ECLAT TEXTILE CO., LTD', + field: 'ships_to' + }, + { + source: 'h1c1zINOWdVkED8hp9ispA', + source_type: 'company', + source_label: 'MADEIRA GARNFABRIK RUDOLF SCHMIDT KG', + target: 'zW_nydyIm8O3VD33pe0o0Q', + target_type: 'company', + target_label: 'CôNG TY TNHH NGUồN á CHâU', + field: 'ships_to' + }, + { + source: '_pPxcNFwuMu_5FSWOv4w6g', + source_type: 'company', + source_label: 'KINGFLOWER THREAD(HK)CO.,LIMITED', + target: 'h1c1zINOWdVkED8hp9ispA', + target_type: 'company', + target_label: 'MADEIRA GARNFABRIK RUDOLF SCHMIDT KG', + field: 'ships_to' + }, + { + source: 'T4MPSlvIEaYFldsX2xb7fA', + source_type: 'person', + source_label: 'Cty TNHH Dây Khóa Kéo KEEN CHING', + target: 'Be1vdQekKL83u9Aq_rEWFw', + target_type: 'company', + target_label: 'ECLAT TEXTILE CO., LTD', + field: 'ships_to' + }, + { + source: 'hiGgxEXPgFXhqHk6i1G6zg', + source_type: 'company', + source_label: 'CÔNG TY TNHH CỮU PHÚ', + target: 'T4MPSlvIEaYFldsX2xb7fA', + target_type: 'person', + target_label: 'Cty TNHH Dây Khóa Kéo KEEN CHING', + field: 'ships_to' + }, + { + source: 'DKIXZUwkld43RoWu3KTWpA', + source_type: 'company', + source_label: 'JOFULL ENTERPRISE CO.,LTD', + target: 'hiGgxEXPgFXhqHk6i1G6zg', + target_type: 'company', + target_label: 'CÔNG TY TNHH CỮU PHÚ', + field: 'ships_to' + }, + { + source: 'ByaP64YCoZNVRIpXaUUKMQ', + source_type: 'company', + source_label: 'GUANGDONG BORUNTE TECHNOLOGY CO.,LTD', + target: 'hiGgxEXPgFXhqHk6i1G6zg', + target_type: 'company', + target_label: 'CÔNG TY TNHH CỮU PHÚ', + field: 'ships_to' + }, + { + source: 'DF4w9KjlJ-A__x_6iWz60Q', + source_type: 'company', + source_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', + target: 'T4MPSlvIEaYFldsX2xb7fA', + target_type: 'person', + target_label: 'Cty TNHH Dây Khóa Kéo KEEN CHING', + field: 'ships_to' + }, + { + source: 'VKupH0pj4YhUwC6WD8TxGA', + source_type: 'company', + source_label: 'WUXI YIH SHING CHEUN MACHINE CO., LTD', + target: 'DF4w9KjlJ-A__x_6iWz60Q', + target_type: 'company', + target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', + field: 'ships_to' + }, + { + source: 'fKTs7nnpxdQxahXh3Nq9JA', + source_type: 'company', + source_label: 'WEI TAI CORPORATION', + target: 'DF4w9KjlJ-A__x_6iWz60Q', + target_type: 'company', + target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', + field: 'ships_to' + }, + { + source: '9C5_d83OpEwNewVVOjHNrw', + source_type: 'company', + source_label: 'CELLULE CO., LTD', + target: 'DF4w9KjlJ-A__x_6iWz60Q', + target_type: 'company', + target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', + field: 'ships_to' + }, + { + source: 'x65TbmYhGSttNMadWTe3pw', + source_type: 'company', + source_label: 'KAI CHU INTERNATIONAL CO., LTD', + target: 'DF4w9KjlJ-A__x_6iWz60Q', + target_type: 'company', + target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', + field: 'ships_to' + }, + { + source: 'HRhx5phSt7svZRLQg6dkmQ', + source_type: 'company', + source_label: 'CHANGZHOU ZHANYE CONSTRUCTION MACHINERY CO., LTD', + target: 'DF4w9KjlJ-A__x_6iWz60Q', + target_type: 'company', + target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', + field: 'ships_to' + }, + { + source: 'tWKCgz02--b74qoWA95xqQ', + source_type: 'company', + source_label: 'PEIR JIUH ENTERPRISE CO., LTD', + target: 'DF4w9KjlJ-A__x_6iWz60Q', + target_type: 'company', + target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', + field: 'ships_to' + }, + { + source: 'ryzCj9dCSzbaCDsz0h-Jlg', + source_type: 'company', + source_label: 'QUINN LIN CO., LTD', + target: 'DF4w9KjlJ-A__x_6iWz60Q', + target_type: 'company', + target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', + field: 'ships_to' + }, + { + source: 'cNG08yZf9q6ZMY7nVYA2ew', + source_type: 'company', + source_label: "XI'AN ARESWIN PRECISION MACHINERY CO.,LTD", + target: 'DF4w9KjlJ-A__x_6iWz60Q', + target_type: 'company', + target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', + field: 'ships_to' + }, + { + source: 'qxihlhEk7ukFF-QQQZLOxQ', + source_type: 'company', + source_label: 'NEWNOL BIOTECH CO., LTD.', + target: 'DF4w9KjlJ-A__x_6iWz60Q', + target_type: 'company', + target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', + field: 'ships_to' + }, + { + source: '5pMw3lvZF6qJtPvdxK_ZQA', + source_type: 'company', + source_label: 'WUXI HONGYUAN ELECTROMECHANICAL TECHNOLOGY CO., LTD', + target: 'DF4w9KjlJ-A__x_6iWz60Q', + target_type: 'company', + target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', + field: 'ships_to' + }, + { + source: 'GJyRWZ96de2RRiTcMS_Uaw', + source_type: 'company', + source_label: 'YSR REED CO., LTD', + target: 'DF4w9KjlJ-A__x_6iWz60Q', + target_type: 'company', + target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', + field: 'ships_to' + }, + { + source: 'y5H2UrmEBdNi2N-sXJWIng', + source_type: 'company', + source_label: 'SHANGHAI MITSUBOSHI TRADING CO.,LTD', + target: 'DF4w9KjlJ-A__x_6iWz60Q', + target_type: 'company', + target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', + field: 'ships_to' + }, + { + source: 'VyOd8MTrV5--TnMsNqgrkg', + source_type: 'company', + source_label: 'YOUNARUI INTERNATIONAL TRADING CO., LTD', + target: 'DF4w9KjlJ-A__x_6iWz60Q', + target_type: 'company', + target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', + field: 'ships_to' + }, + { + source: 'TvLMDrbn5BHeFkf6uZASDA', + source_type: 'company', + source_label: 'YANG JIN DA CO., LTD', + target: 'DF4w9KjlJ-A__x_6iWz60Q', + target_type: 'company', + target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', + field: 'ships_to' + }, + { + source: 'ncHocsMhR3-RS3U7yuaNwQ', + source_type: 'company', + source_label: 'MURATA MACHINERY TAIWAN , LTD.', + target: 'DF4w9KjlJ-A__x_6iWz60Q', + target_type: 'company', + target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', + field: 'ships_to' + }, + { + source: 'a1gh_ttb6-W8ut9HgaVYQA', + source_type: 'company', + source_label: 'SHAOXING SKYLAR TRADING CO., LTD', + target: 'DF4w9KjlJ-A__x_6iWz60Q', + target_type: 'company', + target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', + field: 'ships_to' + }, + { + source: 'wbL8s9SNdI94NvqCEqeG7g', + source_type: 'company', + source_label: 'CHANGZHOU ZHANYE CONSTRUCTION', + target: 'DF4w9KjlJ-A__x_6iWz60Q', + target_type: 'company', + target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', + field: 'ships_to' + }, + { + source: '7nI7ZPnQUEQBC1p_j1eWkw', + source_type: 'company', + source_label: 'OPTIMA VENTURES GROUP LIMITED', + target: 'DF4w9KjlJ-A__x_6iWz60Q', + target_type: 'company', + target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', + field: 'ships_to' + }, + { + source: '80PfVG_vuz0JkAjJIhvcLQ', + source_type: 'company', + source_label: 'AIR RICH TRADING DEVELOPMENT LTD', + target: 'DF4w9KjlJ-A__x_6iWz60Q', + target_type: 'company', + target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', + field: 'ships_to' + }, + { + source: 'nzHjdNwA8FjlDhrerUKTQA', + source_type: 'company', + source_label: 'GEENG TYAN ENTERPRISE CO., LTD.', + target: 'DF4w9KjlJ-A__x_6iWz60Q', + target_type: 'company', + target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', + field: 'ships_to' + }, + { + source: 'p2nNlo2SmAdn65QdX8weSA', + source_type: 'company', + source_label: 'TOYO TEXTILE CO LTD', + target: 'DF4w9KjlJ-A__x_6iWz60Q', + target_type: 'company', + target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', + field: 'ships_to' + }, + { + source: 'w790ve0Opp_Oc71h-Ma1SQ', + source_type: 'company', + source_label: 'HONG TAI HIGH NUMERATOR CO., LTD', + target: 'DF4w9KjlJ-A__x_6iWz60Q', + target_type: 'company', + target_label: 'CÔNG TY HUALON CORPORATION VIỆT NAM', + field: 'ships_to' + }, + { + source: 's3EMkHt64foNbMFhZKsoNA', + source_type: 'company', + source_label: 'CôNG TY TNHH RTI ( VIệT NAM )', + target: 'T4MPSlvIEaYFldsX2xb7fA', + target_type: 'person', + target_label: 'Cty TNHH Dây Khóa Kéo KEEN CHING', + field: 'ships_to' + }, + { + source: 's5WBLgzMhI3KGpCZMchVoQ', + source_type: 'company', + source_label: 'KUNSHAN LITAI FIBER CO., LTD', + target: 's3EMkHt64foNbMFhZKsoNA', + target_type: 'company', + target_label: 'CôNG TY TNHH RTI ( VIệT NAM )', + field: 'ships_to' + }, + { + source: 'rcQyjwf5hkBF9snBWMY8ug', + source_type: 'company', + source_label: 'ARISTO GLOBAL INC.', + target: 's3EMkHt64foNbMFhZKsoNA', + target_type: 'company', + target_label: 'CôNG TY TNHH RTI ( VIệT NAM )', + field: 'ships_to' + }, + { + source: 'KE2fNwJSWT-cmbFI9i76Mg', + source_type: 'company', + source_label: 'OMNITEX INTERNATIONAL CORP.', + target: 's3EMkHt64foNbMFhZKsoNA', + target_type: 'company', + target_label: 'CôNG TY TNHH RTI ( VIệT NAM )', + field: 'ships_to' + }, + { + source: 'BQNENRwoOp6qRYIGgz7HMw', + source_type: 'company', + source_label: 'Công Ty TNHH Một Thành Viên Sơn Hà Duy Xuyên', + target: 'Be1vdQekKL83u9Aq_rEWFw', + target_type: 'company', + target_label: 'ECLAT TEXTILE CO., LTD', + field: 'ships_to' + }, + { + source: 'BY3TWAkWypPYP3p0jhO7kw', + source_type: 'company', + source_label: 'MIEN LI CORP (TAIWAN)', + target: 'BQNENRwoOp6qRYIGgz7HMw', + target_type: 'company', + target_label: 'Công Ty TNHH Một Thành Viên Sơn Hà Duy Xuyên', + field: 'ships_to' + }, + { + source: 'IzrHZn6NKvs0aXGRuoZ36A', + source_type: 'company', + source_label: 'CôNG TY TNHH MộT THàNH VIêN SơN Hà THăNG BìNH', + target: 'BY3TWAkWypPYP3p0jhO7kw', + target_type: 'company', + target_label: 'MIEN LI CORP (TAIWAN)', + field: 'ships_to' + }, + { + source: 'cDn2I1Dhnqj5Nos6xLMQxQ', + source_type: 'company', + source_label: 'DIBELLA B.V.', + target: 'gdAQnpO4Ur8gdyHPPic-3g', + target_type: 'company', + target_label: 'Gul Ahmed Textile Mills Ltd', + field: 'ships_to' + }, + { + source: 'HUjVKQ-aHwTvJ2tlJBY8Og', + source_type: 'company', + source_label: 'M/S A.B. EXPORTS (PVT) LTD,', + target: 'cDn2I1Dhnqj5Nos6xLMQxQ', + target_type: 'company', + target_label: 'DIBELLA B.V.', + field: 'ships_to' + }, + { + source: 'eRnhmbO5WYtDk_LDtJLPgg', + source_type: 'company', + source_label: 'WEISSENGRUBER TEXTIL GMBH,', + target: 'HUjVKQ-aHwTvJ2tlJBY8Og', + target_type: 'company', + target_label: 'M/S A.B. EXPORTS (PVT) LTD,', + field: 'ships_to' + }, + { + source: '2BtDFJ8skgyOhLjtfTud6Q', + source_type: 'company', + source_label: 'ALBASIT EXPORTS', + target: 'eRnhmbO5WYtDk_LDtJLPgg', + target_type: 'company', + target_label: 'WEISSENGRUBER TEXTIL GMBH,', + field: 'ships_to' + }, + { + source: '_UOiaWygi0JqPhJRjbPVTw', + source_type: 'company', + source_label: 'SAPPHIRE TEXTILE SDN BHD', + target: 'HUjVKQ-aHwTvJ2tlJBY8Og', + target_type: 'company', + target_label: 'M/S A.B. EXPORTS (PVT) LTD,', + field: 'ships_to' + }, + { + source: '7xllpuNJ6GomsHewwY44-Q', + source_type: 'company', + source_label: 'M/S SHAMSI INTERNATIONAL (PVT) LTD', + target: '_UOiaWygi0JqPhJRjbPVTw', + target_type: 'company', + target_label: 'SAPPHIRE TEXTILE SDN BHD', + field: 'ships_to' + }, + { + source: '10U5Etnn_K53zndMOlOQcg', + source_type: 'company', + source_label: 'B & D TEXTILES GMBH', + target: 'HUjVKQ-aHwTvJ2tlJBY8Og', + target_type: 'company', + target_label: 'M/S A.B. EXPORTS (PVT) LTD,', + field: 'ships_to' + }, + { + source: 'N1ncemi-0Rp3SIO_XM1KFg', + source_type: 'company', + source_label: 'ARSHAD CORPORATION (PVT) LIMTIED', + target: '10U5Etnn_K53zndMOlOQcg', + target_type: 'company', + target_label: 'B & D TEXTILES GMBH', + field: 'ships_to' + }, + { + source: 'lc7DqhHEOrqnrEPCW5V-lA', + source_type: 'company', + source_label: 'DAGHA TEXTILES (PVT.) LTD.', + target: '10U5Etnn_K53zndMOlOQcg', + target_type: 'company', + target_label: 'B & D TEXTILES GMBH', + field: 'ships_to' + }, + { + source: '1Bo9yl5iFwLyikvHWHyQpQ', + source_type: 'company', + source_label: 'M/S SHAKEEL TEXTILE INDUSTRIES', + target: '10U5Etnn_K53zndMOlOQcg', + target_type: 'company', + target_label: 'B & D TEXTILES GMBH', + field: 'ships_to' + }, + { + source: '7p41-7EcCoOy0b0lI1Io4w', + source_type: 'company', + source_label: 'M/S HASSAN TEXTILES', + target: '10U5Etnn_K53zndMOlOQcg', + target_type: 'company', + target_label: 'B & D TEXTILES GMBH', + field: 'ships_to' + }, + { + source: 'N6gcA1OtXfdql_Hu8DS_Hg', + source_type: 'company', + source_label: 'DAGHA TEXTILES (PVT.) LIMITED', + target: '10U5Etnn_K53zndMOlOQcg', + target_type: 'company', + target_label: 'B & D TEXTILES GMBH', + field: 'ships_to' + }, + { + source: 'CrmtuW83f95ryXiUnmJAhQ', + source_type: 'company', + source_label: 'AL RAHIM TEXTILE INDUSTRIES LIMITED', + target: 'cDn2I1Dhnqj5Nos6xLMQxQ', + target_type: 'company', + target_label: 'DIBELLA B.V.', + field: 'ships_to' + }, + { + source: 'VXhxnqwEsjW59EWgCVbcUw', + source_type: 'company', + source_label: 'MAUI AND SONS', + target: 'CrmtuW83f95ryXiUnmJAhQ', + target_type: 'company', + target_label: 'AL RAHIM TEXTILE INDUSTRIES LIMITED', + field: 'ships_to' + }, + { + source: 'fwYyNPTFUMniLVltbqBSMA', + source_type: 'person', + source_label: 'SAYAM KNIT FAB', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: 'DtTaH8Cg7EVXsuAU8RlbmQ', + source_type: 'company', + source_label: 'MARIS (H.K.) SPORTS GOODS CO.,', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: 'x7MWosNsmNXVl3tZGwT5bg', + source_type: 'company', + source_label: 'J&F HEAD WEAR (SIYANG) CO., LTD', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: 'EKfqm3qSvyXP3uMWNISJtQ', + source_type: 'company', + source_label: 'JINJIANG HONGXING FASHION WEAVING CO., LTD. NO', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: 'f-zE4s0FHt0LPfPCx3lFyw', + source_type: 'company', + source_label: 'NINGBO ZHENGTENG STATIONERY AND CHUN XIAO INDUSTRY ZONE BEILUN', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: 'Jo-LTRhq2cG7pNGvn-EsVA', + source_type: 'company', + source_label: 'NINGBO WAVEDREAM OSIA STATIONERY', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: 'OzA7Nmj7BXyAktspjqJGfg', + source_type: 'company', + source_label: 'NINGBO WAVEDREAM OUTDOOR PRODUCTS CO.,LTD.', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: 'suu3I6k-YKM38bYr99fECg', + source_type: 'company', + source_label: 'BAITAI GROUP LIMITED.', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: 't-zAQNFfSFHGj70zoQ4rbQ', + source_type: 'company', + source_label: 'WUXI LIJING APPAREL CO LTD', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: 'J7zmMyFFV1tW-lJIKiOKhg', + source_type: 'company', + source_label: 'MARIS(H.K)SPORTS GOODS CO.,LIMITED', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: 'gS4dOrYBUxcHtD1JfF48AQ', + source_type: 'company', + source_label: 'SHAOXING VISA-SX IMPORT AND EXPORT', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: 'pCFim5mJwKkzuIR-FEPc5A', + source_type: 'company', + source_label: 'SHAOXING VISA-SX IMPORT AND EXPORT ROOM', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: 'a3HctbpFY_NInQEyIfw4ZQ', + source_type: 'company', + source_label: 'WUXI HUIHUANG GARMENT CO.,LTD RM', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: 'PLgW3xdOuwzSnV1AVDVLEg', + source_type: 'company', + source_label: 'VASEN INTERNATIONAL LTD', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: 'Yh93aIJyM7H30-z3JW29rQ', + source_type: 'company', + source_label: 'NANCHANG KANGYE CLOTHING CO.,LTD.', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: 'xoBwJxNRu-ywDXhQ27O4zQ', + source_type: 'company', + source_label: 'RADIAL INTERNATIONAL LTD. ( UNIT 2 ZIRANI BAZAR,', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: 'qY9kSlLUCBE-PiU4JD7QOQ', + source_type: 'company', + source_label: 'MARIS(H.K)SPORTS GOODS CO.,LIMITED FLAT C', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: '9Ir2xeGZTnwFbp2B6UAXMg', + source_type: 'company', + source_label: 'NANCHANG KANGYE CLOTHING CO.,LTD. CHANG DONG INDUSTRIAL ZONE,', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: 'S9I-YBojGL4hGbAw3pCDvQ', + source_type: 'company', + source_label: 'GUANGZHOU YING TAI PACKING CO.,LTD ROOM', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: 'pAqBOnuxDYCzkYulTlel4w', + source_type: 'company', + source_label: 'ZHEJINAG LEO&JERRY INTERNATIONAL ROOM A', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: '8U_n94QllNedUaHoQKlk4Q', + source_type: 'company', + source_label: 'JINJIANG HONGXING FASHION WEAVING', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: 'XoCPPJ_7kRnLzP7Qxpom6w', + source_type: 'company', + source_label: 'WUXI LIJING APPAREL CO.,LTD RM', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: 'IYO-Sml1WNrIB9SAta9WKA', + source_type: 'company', + source_label: 'NRN FASHION', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: 'us-YXVRb-jqBejotNJSeOg', + source_type: 'company', + source_label: 'LANGSHI GRAMENTS AND WEAVING CO LTD', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: '2_WvXovlFzvuLlB-SxH0VQ', + source_type: 'company', + source_label: 'YONGKANG JACKOK SPORT GOODS ENTERPRISE FENGSHANZUI INDUSTRY', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: 'uHEEPFjo1hGXytZhtO2VMw', + source_type: 'company', + source_label: 'ZHONG QIAN (GZ) AQUATIC SPORTS RM', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: '_gmHn1hbswM9dDk-ChfVig', + source_type: 'company', + source_label: 'LANGSHI GRAMENTS &WEAVING CO.,LTD', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: 'MKU0paYPbq84EZZ8wAUI2A', + source_type: 'company', + source_label: 'LANGSHI GRAMENTS &WEAVING CO.,LTD SANOU INDUSTRIAL ZONE,YINGLIN', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: 'TXqzK158yR_HNsRdp4ZWIQ', + source_type: 'company', + source_label: 'MARIS(H.K)SPORTS GOODS CO.,LIMITED RM', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: '-ys5KWTHG2mym-cf0JAfig', + source_type: 'company', + source_label: 'LANGSHI GRAMENTS WEAVING CO.,LTD JINJIANG', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: '9LprkMjlCamhO12h6G_qKA', + source_type: 'company', + source_label: 'JINJIANG HONGXING FASHION WEAVING NO', + target: 'VXhxnqwEsjW59EWgCVbcUw', + target_type: 'company', + target_label: 'MAUI AND SONS', + field: 'ships_to' + }, + { + source: 'Bxpg-E90vIyRVD5r_gqdNA', + source_type: 'company', + source_label: 'LUCKY TEXTILE MILLS LIMITED', + target: 'cDn2I1Dhnqj5Nos6xLMQxQ', + target_type: 'company', + target_label: 'DIBELLA B.V.', + field: 'ships_to' + }, + { + source: 'w3mbOSsnfEVvAUuRmAfIkw', + source_type: 'company', + source_label: 'MORITO SCOVILL AMERICAS, LLC', + target: 'Bxpg-E90vIyRVD5r_gqdNA', + target_type: 'company', + target_label: 'LUCKY TEXTILE MILLS LIMITED', + field: 'ships_to' + }, + { + source: 'k9yiaeS4EANKlJlZN1qS9Q', + source_type: 'company', + source_label: 'CHANGSHU TONGGAO MARKETING CO LTD', + target: 'w3mbOSsnfEVvAUuRmAfIkw', + target_type: 'company', + target_label: 'MORITO SCOVILL AMERICAS, LLC', + field: 'ships_to' + }, + { + source: '7htrbTtdrjLqKOeY8aRmvg', + source_type: 'company', + source_label: 'OISHI INDUSTRIES VIET NAM CO LTD', + target: 'w3mbOSsnfEVvAUuRmAfIkw', + target_type: 'company', + target_label: 'MORITO SCOVILL AMERICAS, LLC', + field: 'ships_to' + }, + { + source: 'Gn9tAwz1K3vE8CW8vOFCMA', + source_type: 'person', + source_label: 'Chi Nhánh Tổng Công Ty Liksin - Xí Nghiệp Bao Bì Liksin', + target: 'FIdog3J2WSI6M9hRhKVF9A', + target_type: 'company', + target_label: 'CONG TY TNHH GUNZE VIET NAM', + field: 'ships_to' + }, + { + source: 'uhzL27CzUhEp4__oYjuzzw', + source_type: 'company', + source_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + target: 'Gn9tAwz1K3vE8CW8vOFCMA', + target_type: 'person', + target_label: 'Chi Nhánh Tổng Công Ty Liksin - Xí Nghiệp Bao Bì Liksin', + field: 'ships_to' + }, + { + source: 'uSJzsEbnl7o-eBPBdTwWMQ', + source_type: 'company', + source_label: 'CONG TY TNHH DIEN - DIEN LANH PHUONG DONG', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'prcQUlvKOFtoBtyNBGUNkQ', + source_type: 'company', + source_label: 'CôNG TY TNHH TONY GOLDEN BEES', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'zCKtjZbudfvygUwJNkL8ng', + source_type: 'company', + source_label: 'CONG TY TNHH SAN XUAT - THUONG MAI & DICH VU HD', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'Ue7_6j-AKdfz79pAOJvTDg', + source_type: 'company', + source_label: 'CONG TY TNHH TM DV SX KY THUAT THI CONG CO DIEN LANH SAI GON', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'wXejiXrM2Rxc9zNb52fVJg', + source_type: 'company', + source_label: 'CONG TY TNHH THUONG MAI VA DICH VU ANH VU V N N', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'vtEsCjq2splJwsJfBYX45g', + source_type: 'company', + source_label: 'CONG TY TNHH THUC PHAM HUU CO VIET NAM', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'Hu9sy86JkVmjWLEwO0eBPw', + source_type: 'company', + source_label: 'QINGDAO SHENG ZHI HAN AGRICULTURAL DEVELOPMENT CO., LTD.', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'q8WEQmF3LQZFYQRkZls4lA', + source_type: 'company', + source_label: 'CONG TY CO PHAN DAU TU HOP THANH PHAT', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'ByY-nOHaGpqeCt5WDkq5eQ', + source_type: 'company', + source_label: 'QINGDAO GLAD ENGIEERING TECHNOLOGY', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'LmvEWavRdHzpsmess7wXqA', + source_type: 'company', + source_label: 'CONG TY TNHH EKIDEN VIET NAM', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'IqbzAc9MwbIWHO0fee68aQ', + source_type: 'company', + source_label: 'FRUITSMART', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'BqQyAEdwqU6P_I7sCLFp3A', + source_type: 'person', + source_label: 'CHI NHANH TONG CONG TY LIKSIN - XI NGHIEP BAO BI AN KHANG LIKSIN', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'Wl3rTlfFYn6UQ_p8lowM8Q', + source_type: 'person', + source_label: 'CHI NHANH TONG CONG TY LIKSIN - XI NGHIEP BAO BI LIKSIN', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: '2yYoYhvhDzd94B1wkUIOMA', + source_type: 'company', + source_label: 'CHI NHANH CONG TY CP DAU THUC VAT TUONG AN - NHA MAY DAU PHU MY', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: '7cgv3mjIjRZ13wv8cT2Yag', + source_type: 'company', + source_label: 'CÔNG TY TRÁCH NHIỆM HỮU HẠN HO DO', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'RIT8pfvcFkxX_ZdoWilGKA', + source_type: 'company', + source_label: 'ICA S.P.A', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'xPnJLoVG-m9dVlotIZDTeQ', + source_type: 'company', + source_label: 'CôNG TY TNHH AN PHươNG TECHNOLOGY', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'AkcjhIEiNiO-mWUmcnticw', + source_type: 'company', + source_label: 'CONG TY TNHH THUONG MAI DICH VU KY THUAT PHUC SANG MINH', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'VHkFwGrmL5lxeJjnzC61yA', + source_type: 'company', + source_label: 'CÔNG TY TNHH BẢO AN', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'vFLTafXmjp5whVNy6E3s_w', + source_type: 'company', + source_label: 'NOIDA FABCON MACHINES (P) LTD', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'Qu8geiEofMXheLVPlQCAdw', + source_type: 'company', + source_label: 'SURAJ AGIMPEX HOUSE', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'seUhUlovi6ZSnisSmtbZag', + source_type: 'company', + source_label: 'VINAY INDUSTRIES LTD', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'm_aKEiRErMPoOXxJ-z5Qmg', + source_type: 'company', + source_label: 'CONTG TY CO PHAN DAU TU CONG NGHIEP SAI GON', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: '-e26_QXeiZ_tnPo3fLiPOQ', + source_type: 'company', + source_label: 'ZIBO DEROLA HOUSEWARE.COM', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'OrkIXANS3-VPU-uuSw2PJQ', + source_type: 'company', + source_label: 'CONG TY TNHH THUONG MAI DICH VU LAM GIA PHU', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'hBRLkpW4Kv-C6lWjA6NB3g', + source_type: 'company', + source_label: 'HWA HENG LEE SDN BHD', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'unabDq3OjFNc9QTqU5Csmg', + source_type: 'company', + source_label: 'CONG TY CO PHAN DAU TU PHAT TRIEN SAN XUAT MIEN NAM', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'QBdB0pCd9ktNaLkGSPWSdw', + source_type: 'company', + source_label: 'Công Ty Cổ Phần Đầu Tư Phát Triển Sản Xuất Miền Nam', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: '4T-hDsY1UmUwiTKPaQovTg', + source_type: 'company', + source_label: 'CONG TY TNHH MOT THANH VIEN MAY DONG GOI Q.A', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'I22NCQpBLwAFzQZOokNGqQ', + source_type: 'company', + source_label: 'CONG TY CO PHAN HUNG PHUONG', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: '0SiOqPrsFo8_TdA1Y7aqBg', + source_type: 'company', + source_label: 'CÔNG TY CỔ PHẦN CÔNG NGHỆ BIZFONE', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'Uly7G9_wjrYGLFIbgt6Jvg', + source_type: 'company', + source_label: 'CONG TY TNHH TM CO DIEN TU VIETTECH', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'w4SLTlNgEJk8THOLcNuolQ', + source_type: 'company', + source_label: 'CONG TY TNHH THUONG MAI DICH VU XUAT NHAP KHAU GOLDNUTS', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: '20E5FyKWwxKYMIZXM23myg', + source_type: 'company', + source_label: 'FL USA', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'sMnf1Y7IZqkkQtatFSrc5w', + source_type: 'company', + source_label: 'GRATEFOOD CO', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'P6Wtazq4zHk21NZTgMKiPA', + source_type: 'company', + source_label: 'CONG TY TNHH MOT THANH VIEN CO KHI XAY DUNG NHAT THANH', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'dIm7pEgnwdkhnmcWbNaUnQ', + source_type: 'company', + source_label: 'CÔNG TY TNHH TIẾP VẬN CONTAINER RỒNG ĐỎ', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'CUr9cjpiDfgSPvRyaxNB0Q', + source_type: 'company', + source_label: 'CONG TY TNHH CO KHI - SAN XUAT - THUONG MAI DAI PHUOC HUY', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: '-v6MQdJSJ_UYS3aae6izRQ', + source_type: 'company', + source_label: 'NUNZIATA TECNOLOGIE AGROALIMENTARI S.R.L.', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: 'YP0-VaDytSnUBMXmEBWiPA', + source_type: 'company', + source_label: 'OFI', + target: 'uhzL27CzUhEp4__oYjuzzw', + target_type: 'company', + target_label: 'CÔNG TY TNHH CHẾ BIẾN THỰC PHẨM OLAM VIỆT NAM', + field: 'ships_to' + }, + { + source: '2D-Mr_wjWBe2TcaChUYZwg', + source_type: 'company', + source_label: 'MAGNA PROCESSING INDUSTRIES (PRIVATE) LIMITED', + target: '10U5Etnn_K53zndMOlOQcg', + target_type: 'company', + target_label: 'B & D TEXTILES GMBH', + field: 'ships_to' + }, + { + source: 'YapOmucDnADGforvDfIlQA', + source_type: 'company', + source_label: 'Crimson Middle East FZ-LLC', + target: '2D-Mr_wjWBe2TcaChUYZwg', + target_type: 'company', + target_label: 'MAGNA PROCESSING INDUSTRIES (PRIVATE) LIMITED', + field: 'ships_to' + }, + { + source: 'KYMPVbdyYDEkSaxAGsX8jw', + source_type: 'company', + source_label: 'M/S CRYSTALLINE CHEMICAL INDUSTRIES (PVT) LTD', + target: 'YapOmucDnADGforvDfIlQA', + target_type: 'company', + target_label: 'Crimson Middle East FZ-LLC', + field: 'ships_to' + }, + { + source: 'lL9wLO3YqbM8nrhfR-rLyg', + source_type: 'company', + source_label: 'ILSHIN VIETNAM CO LTD', + target: 'gdAQnpO4Ur8gdyHPPic-3g', + target_type: 'company', + target_label: 'Gul Ahmed Textile Mills Ltd', + field: 'ships_to' + }, + { + source: '4v2gb4GRgim65mKbz3Rx_Q', + source_type: 'company', + source_label: 'CARGILL INDIA PRIVATE LIMITED', + target: 'lL9wLO3YqbM8nrhfR-rLyg', + target_type: 'company', + target_label: 'ILSHIN VIETNAM CO LTD', + field: 'ships_to' + }, + { + source: 'Zi_kc6HOxUUyQXuztqgq5g', + source_type: 'company', + source_label: 'CARGILL SIAM LIMITED', + target: '4v2gb4GRgim65mKbz3Rx_Q', + target_type: 'company', + target_label: 'CARGILL INDIA PRIVATE LIMITED', + field: 'ships_to' + }, + { + source: 'RxPiKR6MmsefnQwTWioYFQ', + source_type: 'company', + source_label: 'ALLIGATOR AUTOMATIONS', + target: 'Zi_kc6HOxUUyQXuztqgq5g', + target_type: 'company', + target_label: 'CARGILL SIAM LIMITED', + field: 'ships_to' + }, + { + source: 'fntBHHpybQ56CR-7t8B6LQ', + source_type: 'company', + source_label: 'DUNE PACKAGING LTD', + target: 'RxPiKR6MmsefnQwTWioYFQ', + target_type: 'company', + target_label: 'ALLIGATOR AUTOMATIONS', + field: 'ships_to' + }, + { + source: 'veLGjZeYigX6RjXFQcfObw', + source_type: 'company', + source_label: 'Cocelpa Cia De Celulose E Papel Do Parana', + target: 'fntBHHpybQ56CR-7t8B6LQ', + target_type: 'company', + target_label: 'DUNE PACKAGING LTD', + field: 'ships_to' + }, + { + source: 'QGFzdyqmiK0cB9esCA0Asg', + source_type: 'company', + source_label: 'COCELPA CIA DE CELULOSE & PAPEL DO PARANA', + target: 'fntBHHpybQ56CR-7t8B6LQ', + target_type: 'company', + target_label: 'DUNE PACKAGING LTD', + field: 'ships_to' + }, + { + source: 'tXrKwvLwJwT6RaTyeVmtsA', + source_type: 'company', + source_label: 'BUNGE ASIA PTE LTD.', + target: '4v2gb4GRgim65mKbz3Rx_Q', + target_type: 'company', + target_label: 'CARGILL INDIA PRIVATE LIMITED', + field: 'ships_to' + }, + { + source: 'G2fG1hdYBVRax9fLcya8HA', + source_type: 'company', + source_label: 'CôNG TY TNHH KINH DOANH NôNG SảN VIệT NAM', + target: 'tXrKwvLwJwT6RaTyeVmtsA', + target_type: 'company', + target_label: 'BUNGE ASIA PTE LTD.', + field: 'ships_to' + }, + { + source: '_sw5QmIYZcWpIvmqLz8o_w', + source_type: 'company', + source_label: 'KICE INDUSTRIES, INC.', + target: 'G2fG1hdYBVRax9fLcya8HA', + target_type: 'company', + target_label: 'CôNG TY TNHH KINH DOANH NôNG SảN VIệT NAM', + field: 'ships_to' + }, + { + source: '6IbYeD1a_TkU-GIC33s-fw', + source_type: 'company', + source_label: 'DONGGUAN CITY LONGSHENG HARDWAR', + target: '_sw5QmIYZcWpIvmqLz8o_w', + target_type: 'company', + target_label: 'KICE INDUSTRIES, INC.', + field: 'ships_to' + }, + { + source: 'lHZn80ydV-7o77YhYaaZBw', + source_type: 'company', + source_label: 'GOLDEN AGRI INTERNATIONAL PTE LTD', + target: '4v2gb4GRgim65mKbz3Rx_Q', + target_type: 'company', + target_label: 'CARGILL INDIA PRIVATE LIMITED', + field: 'ships_to' + }, + { + source: 'MRVrgZsql7qjNzOrAgETzA', + source_type: 'company', + source_label: 'THE THAL INDUSTRIES CORPORATION LIMITED', + target: 'lHZn80ydV-7o77YhYaaZBw', + target_type: 'company', + target_label: 'GOLDEN AGRI INTERNATIONAL PTE LTD', + field: 'ships_to' + }, + { + source: '8hy5JQaRgCMigrDqeaL9cw', + source_type: 'company', + source_label: 'YOKOGAWA MIDDLE EAST & AFRICA BSC (', + target: 'MRVrgZsql7qjNzOrAgETzA', + target_type: 'company', + target_label: 'THE THAL INDUSTRIES CORPORATION LIMITED', + field: 'ships_to' + }, + { + source: 'heSIwK8lxfqFNi5lbs8xUg', + source_type: 'company', + source_label: 'PANTECH INSTRUMENTS', + target: '8hy5JQaRgCMigrDqeaL9cw', + target_type: 'company', + target_label: 'YOKOGAWA MIDDLE EAST & AFRICA BSC (', + field: 'ships_to' + }, + { + source: 'ZwnshoeI_mJRiGpqQfzcxQ', + source_type: 'company', + source_label: 'Chashma Sugar Mills Limited', + target: 'lHZn80ydV-7o77YhYaaZBw', + target_type: 'company', + target_label: 'GOLDEN AGRI INTERNATIONAL PTE LTD', + field: 'ships_to' + }, + { + source: '2RqxeQQ6eIJGsGws0fHdtA', + source_type: 'company', + source_label: 'BEACON COMMODITIES LTD.', + target: 'ZwnshoeI_mJRiGpqQfzcxQ', + target_type: 'company', + target_label: 'Chashma Sugar Mills Limited', + field: 'ships_to' + }, + { + source: 'LZTGRrF2FjYo3-xGdu_cMg', + source_type: 'company', + source_label: 'FERNS FINE FOODS PRIVATE LIMITED', + target: '2RqxeQQ6eIJGsGws0fHdtA', + target_type: 'company', + target_label: 'BEACON COMMODITIES LTD.', + field: 'ships_to' + }, + { + source: 'NhaDW7gKnsxR14FLOaW3Uw', + source_type: 'company', + source_label: 'BUNGE S.A', + target: '4v2gb4GRgim65mKbz3Rx_Q', + target_type: 'company', + target_label: 'CARGILL INDIA PRIVATE LIMITED', + field: 'ships_to' + }, + { + source: 'BkSvjycUL2nCb2ylImFYEA', + source_type: 'company', + source_label: 'BUNGE PARAGUAY SA', + target: 'NhaDW7gKnsxR14FLOaW3Uw', + target_type: 'company', + target_label: 'BUNGE S.A', + field: 'ships_to' + }, + { + source: 'ilSw6c5Yajm1dS-gXN7CyA', + source_type: 'company', + source_label: 'MACROSOURCE LLC', + target: 'BkSvjycUL2nCb2ylImFYEA', + target_type: 'company', + target_label: 'BUNGE PARAGUAY SA', + field: 'ships_to' + }, + { + source: 'NRlLXs3cy0CUnAL7Q6m0aQ', + source_type: 'company', + source_label: 'ROTEM AMFERT NEGEV WORKS LTD.', + target: 'ilSw6c5Yajm1dS-gXN7CyA', + target_type: 'company', + target_label: 'MACROSOURCE LLC', + field: 'ships_to' + }, + { + source: 'ccDnCZdzGdvbrrPfiX2c1Q', + source_type: 'company', + source_label: 'ZHEJIANG SUNFIT ADVANCED MATERIALS', + target: 'ilSw6c5Yajm1dS-gXN7CyA', + target_type: 'company', + target_label: 'MACROSOURCE LLC', + field: 'ships_to' + }, + { + source: 'L9OJrva_-5HYC6kAedkR4A', + source_type: 'company', + source_label: 'NINGBO HANGJUN INTERNATIONAL', + target: 'ilSw6c5Yajm1dS-gXN7CyA', + target_type: 'company', + target_label: 'MACROSOURCE LLC', + field: 'ships_to' + }, + { + source: '7jsPrGqOLAQ5rtJ5yABrDg', + source_type: 'company', + source_label: '75 SHEVERNOYE SHOSSE 162622 C. CHEREPOVETS, VOLOGDA REGION', + target: 'ilSw6c5Yajm1dS-gXN7CyA', + target_type: 'company', + target_label: 'MACROSOURCE LLC', + field: 'ships_to' + }, + { + source: 'v6mWRXPijyawdp6P3KddMw', + source_type: 'company', + source_label: "JSC ''APATIT'' SEVERNOYE SHOSSE, 75", + target: 'ilSw6c5Yajm1dS-gXN7CyA', + target_type: 'company', + target_label: 'MACROSOURCE LLC', + field: 'ships_to' + }, + { + source: '4VdkgBq6mNdNrrD8Rkp7Qw', + source_type: 'company', + source_label: 'SOLAR TURBINES EAME S.R.O.', + target: 'gdAQnpO4Ur8gdyHPPic-3g', + target_type: 'company', + target_label: 'Gul Ahmed Textile Mills Ltd', + field: 'ships_to' + }, + { + source: '6_mk9wkNvwoaswly1pDvUQ', + source_type: 'company', + source_label: 'OIL AND NATURAL GAS CORPORATION LIMITED', + target: '4VdkgBq6mNdNrrD8Rkp7Qw', + target_type: 'company', + target_label: 'SOLAR TURBINES EAME S.R.O.', + field: 'ships_to' + }, + { + source: 'BXkymLD-EP8oGQzw8pEcYg', + source_type: 'company', + source_label: 'DE NORA WATER TECHNOLOGIES, LLC', + target: '6_mk9wkNvwoaswly1pDvUQ', + target_type: 'company', + target_label: 'OIL AND NATURAL GAS CORPORATION LIMITED', + field: 'ships_to' + }, + { + source: 'Hl2EcfvD9B0UKLsKLHTrbQ', + source_type: 'company', + source_label: 'DE NORA ELETTRODI (SUZHOU) CO LTD', + target: 'BXkymLD-EP8oGQzw8pEcYg', + target_type: 'company', + target_label: 'DE NORA WATER TECHNOLOGIES, LLC', + field: 'ships_to' + }, + { + source: 'AkhPYIzkdy0kRpJvpp-b1A', + source_type: 'company', + source_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', + target: 'Hl2EcfvD9B0UKLsKLHTrbQ', + target_type: 'company', + target_label: 'DE NORA ELETTRODI (SUZHOU) CO LTD', + field: 'ships_to' + }, + { + source: 'i38exTOu9uZWzUc36rhNDQ', + source_type: 'company', + source_label: 'DE NORA DEUTSCHLAND GMBH , INDUSTRIESTRASSE 17 635', + target: 'AkhPYIzkdy0kRpJvpp-b1A', + target_type: 'company', + target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', + field: 'ships_to' + }, + { + source: '-6PBYPVh7xFlQ6NSelGvxA', + source_type: 'company', + source_label: 'WEIFANG BINHAI PETRO- CHEM CO., LTD NO.001001 XIAN', + target: 'AkhPYIzkdy0kRpJvpp-b1A', + target_type: 'company', + target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', + field: 'ships_to' + }, + { + source: '0PR2Cb5xQ4lv7FJ3_z8i8w', + source_type: 'company', + source_label: 'PACIFIC OLEOCHEMICALS SDN. BHD (64175-U) , PLO 285', + target: 'AkhPYIzkdy0kRpJvpp-b1A', + target_type: 'company', + target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', + field: 'ships_to' + }, + { + source: 'TT-AfLoL3VxwbukNEUZNmA', + source_type: 'company', + source_label: 'ADVANCED INDUSTRIAL SUPPLY FZE', + target: 'AkhPYIzkdy0kRpJvpp-b1A', + target_type: 'company', + target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', + field: 'ships_to' + }, + { + source: 'E0wMzPJ28DNPaGizuzU3Aw', + source_type: 'company', + source_label: 'FELDA MARKETING SERVICES SDN. BHD.', + target: 'AkhPYIzkdy0kRpJvpp-b1A', + target_type: 'company', + target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', + field: 'ships_to' + }, + { + source: 'BhyzJT9ITOKURmmgvFMNrw', + source_type: 'company', + source_label: 'INDIX S.R.L. , VIALE RESTELLI 3 - 20124 MILANO ITA', + target: 'AkhPYIzkdy0kRpJvpp-b1A', + target_type: 'company', + target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', + field: 'ships_to' + }, + { + source: 'U05yDL6_DuQ5iKJ_y9orVg', + source_type: 'company', + source_label: 'EINAR WILLUMSEN A/S , ABILDAGER 23-25 2605 BRENDBY', + target: 'AkhPYIzkdy0kRpJvpp-b1A', + target_type: 'company', + target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', + field: 'ships_to' + }, + { + source: 'mRE6Vhqq60KXedNg3tLcSA', + source_type: 'company', + source_label: 'NATURAL OLEOCHEMICALS SDN BHD. , PLO 338, JALAN TE', + target: 'AkhPYIzkdy0kRpJvpp-b1A', + target_type: 'company', + target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', + field: 'ships_to' + }, + { + source: 'VRxaYpmhafLw8u7mCTIRbg', + source_type: 'company', + source_label: 'GUIZHOU REDSTAR DEVELOPING IMPORT& , EXPORT CO.,LT', + target: 'AkhPYIzkdy0kRpJvpp-b1A', + target_type: 'company', + target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', + field: 'ships_to' + }, + { + source: 'ZaGELahXdbePiEB9GFKUoQ', + source_type: 'company', + source_label: 'GUIZHOU REDSTAR DEVELOPING , IMPORT AND EXPORT CO.', + target: 'AkhPYIzkdy0kRpJvpp-b1A', + target_type: 'company', + target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', + field: 'ships_to' + }, + { + source: 'DXyt2riAdby5RMyOmF549Q', + source_type: 'company', + source_label: 'ISTANBUL OZGE MAKINA SAN TIC LTD , STI 19 MAYIS MA', + target: 'AkhPYIzkdy0kRpJvpp-b1A', + target_type: 'company', + target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', + field: 'ships_to' + }, + { + source: 'jQWfEzf_ma9DAa1_clcbJA', + source_type: 'company', + source_label: 'WEIFANG BINHAI PETRO- CHEM CO., LTD , NO.001001 XIA', + target: 'AkhPYIzkdy0kRpJvpp-b1A', + target_type: 'company', + target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', + field: 'ships_to' + }, + { + source: 'PE11z7lEBa9fkGpZFMM8SA', + source_type: 'company', + source_label: 'GIVAUDAN MEA FZE , U.A.E.', + target: 'AkhPYIzkdy0kRpJvpp-b1A', + target_type: 'company', + target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', + field: 'ships_to' + }, + { + source: 'EotulGFZHVjdkzqKf6PDMw', + source_type: 'company', + source_label: 'TRADERICH INTERNATIONAL SDN. BHD.', + target: 'AkhPYIzkdy0kRpJvpp-b1A', + target_type: 'company', + target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', + field: 'ships_to' + }, + { + source: 'G3ExzlsuCUNbSWIk5TWBoQ', + source_type: 'company', + source_label: 'FRUTAROM ETOL D.O.O. , SKOFJA VAS 39 3211 SKOFJA V', + target: 'AkhPYIzkdy0kRpJvpp-b1A', + target_type: 'company', + target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', + field: 'ships_to' + }, + { + source: 'P8IoXQxhzW7mypvYPet6Eg', + source_type: 'person', + source_label: 'AEROSOL MAKINE TEKNOLOJILERI BARIS ELVAN KESME VE', + target: 'AkhPYIzkdy0kRpJvpp-b1A', + target_type: 'company', + target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', + field: 'ships_to' + }, + { + source: 'u77EzCcGCo3kxHqsj64QMA', + source_type: 'company', + source_label: 'IMEX LIMITED RM 905 WORKINGBERG , COMM BLDG,41-47', + target: 'AkhPYIzkdy0kRpJvpp-b1A', + target_type: 'company', + target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', + field: 'ships_to' + }, + { + source: 'IOBmkChDd4KKK5EbOln1wA', + source_type: 'company', + source_label: 'PALM-OLEO SDN BHD , LOT 1245 KUNDANG INDUSTRIAL ES', + target: 'AkhPYIzkdy0kRpJvpp-b1A', + target_type: 'company', + target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', + field: 'ships_to' + }, + { + source: 'BN3PFTbF0dOCIhWGf4MS6g', + source_type: 'company', + source_label: 'EVYP SABUN MALAYSIA SDN BHD', + target: 'AkhPYIzkdy0kRpJvpp-b1A', + target_type: 'company', + target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', + field: 'ships_to' + }, + { + source: 'SouCCM-pSXPTbZhHHn15Zg', + source_type: 'company', + source_label: 'NANTONG TONGJI CO LTD , NO 19 DASHENG ROAD NANTONG', + target: 'AkhPYIzkdy0kRpJvpp-b1A', + target_type: 'company', + target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', + field: 'ships_to' + }, + { + source: 'DrTJoyNpi8qFPtfpuSjMMQ', + source_type: 'company', + source_label: 'SOUTHERN ACIDS INDUSTRIES SDN. BHD. , LEVEL 29, CE', + target: 'AkhPYIzkdy0kRpJvpp-b1A', + target_type: 'company', + target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', + field: 'ships_to' + }, + { + source: 'zX0iUjcA2GoGH3EO10Mgcg', + source_type: 'company', + source_label: 'JIANGXI JINKE INTERNATIONAL TRADE CO ., LTD , ROOM', + target: 'AkhPYIzkdy0kRpJvpp-b1A', + target_type: 'company', + target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', + field: 'ships_to' + }, + { + source: 'nbbne4ljdN8t8Vx2S7RwfA', + source_type: 'company', + source_label: 'AGRISKY CO.,LTD , OFFICE ADDRESS:RM 1203,NO.1 BUIL', + target: 'AkhPYIzkdy0kRpJvpp-b1A', + target_type: 'company', + target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', + field: 'ships_to' + }, + { + source: 'TM_3H_lWy4q255ehpYViCA', + source_type: 'company', + source_label: 'SWISS SINGAPORE , SINGAPROE', + target: 'AkhPYIzkdy0kRpJvpp-b1A', + target_type: 'company', + target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', + field: 'ships_to' + }, + { + source: 'isPIvstXNp3vp2sRrfnS7Q', + source_type: 'company', + source_label: 'PALM-OLEO SDN BHD , LOT 1245, KUNDANG INDUSTRIAL E', + target: 'AkhPYIzkdy0kRpJvpp-b1A', + target_type: 'company', + target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', + field: 'ships_to' + }, + { + source: 'b9wtTcxCY1v0jsq4ihL2WQ', + source_type: 'company', + source_label: 'SUZHOU LONGZHENG PACKAGINGTECHNOLOGY CO.,LTD. 8 W', + target: 'AkhPYIzkdy0kRpJvpp-b1A', + target_type: 'company', + target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', + field: 'ships_to' + }, + { + source: 'Rdpk5v6jYCh7olRvO3jH2g', + source_type: 'company', + source_label: 'MEPLAST PLASTIK TEKNOLOJI SAN VE LT ESENKENT MAH.', + target: 'AkhPYIzkdy0kRpJvpp-b1A', + target_type: 'company', + target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', + field: 'ships_to' + }, + { + source: 'yTkVlCMsfPsyIFIiu9bSEA', + source_type: 'company', + source_label: 'EVYAP SABUN MALAYSIA SDN BHD , PLO 70, JALAN NIBON', + target: 'AkhPYIzkdy0kRpJvpp-b1A', + target_type: 'company', + target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', + field: 'ships_to' + }, + { + source: 'mf4uByHrdlGGtlNgVYIPXA', + source_type: 'company', + source_label: 'ADVANCE INDUSTRIAL SUPPLY FZE , AL COURNICH STR MA', + target: 'AkhPYIzkdy0kRpJvpp-b1A', + target_type: 'company', + target_label: 'NIMIR INDUSTRIAL CHEMICALS LIMITED', + field: 'ships_to' + } +] diff --git a/examples/tidy-tree/index.html b/examples/tidy-tree/index.html new file mode 100644 index 00000000..ef1eb2df --- /dev/null +++ b/examples/tidy-tree/index.html @@ -0,0 +1,24 @@ + + + + + Graph + + + + + + +
    + + + diff --git a/examples/tidy-tree/index.ts b/examples/tidy-tree/index.ts new file mode 100644 index 00000000..3f9698f8 --- /dev/null +++ b/examples/tidy-tree/index.ts @@ -0,0 +1,167 @@ +import Stats from 'stats.js' +import * as Hierarchy from '../../src/layout/hierarchy' +import * as Graph from '../../src' +import * as Zoom from '../../src/bindings/native/zoom' +import * as WebGL from '../../src/renderers/webgl' +import data from './data' + +export const stats = new Stats() +stats.showPanel(0) // 0: fps, 1: ms, 2: mb, 3+: custom +document.body.appendChild(stats.dom) + +type Node = Graph.Node & { type: string } +type Edge = Graph.Edge & { field: string } + +const VIEWPORT_PADDING = 100 +const NODE_RADIUS = 8 + +/** + * Initialize Layout and Renderer + */ +const container = document.querySelector('#graph') as HTMLDivElement +const hierarchy = Hierarchy.Layout() +const zoomControl = Zoom.Control({ container }) +const render = WebGL.Renderer({ + container, + debug: { stats, logPerformance: false } +}) + +/** + * Initialize Layout and Renderer Options + */ + +const size = { width: container.offsetWidth, height: container.offsetHeight } +const nodeSize: [number, number] = [NODE_RADIUS * 2 + 8, 250] +const options: Hierarchy.Options = { + nodeSize, + anchor: 'left', + alignment: 'min', + sort: (a, b) => b.height - a.height +} + +/** + * Initialize Data + */ + +const createNodeStyle = (type: string, hover = false): Graph.NodeStyle => { + if (type === 'company') { + return { + color: '#FFB71B', + stroke: [{ color: '#FFF', width: 1 }, { color: hover ? '#FFB71B' : '#FFF' }], + label: { placement: 'right', fontSize: 8 } + } + } else { + return { + color: '#0A85FF', + stroke: [{ color: '#FFF', width: 1 }, { color: hover ? '#0A85FF' : '#FFF' }], + label: { placement: 'right', fontSize: 8 } + } + } +} + +const createNode = (id: string, label: string, type: string): Node => ({ + id, + type, + label, + radius: NODE_RADIUS, + style: createNodeStyle(type) +}) + +const createEdge = (id: string, source: string, target: string, field: string): Edge => ({ + id, + source, + target, + field, + style: { arrow: 'none' } +}) + +const root = '875yxpVvxV2RsweKMRiu7g' +const graph = data.reduce<{ nodes: Record; edges: Record }>( + (accu, { source, source_label, source_type, target, target_label, target_type, field }) => { + const edge = `${source}-${field}-${target}` + if (accu.edges[edge] === undefined) { + accu.edges[edge] = createEdge(edge, source, target, field) + } + if (accu.nodes[source] === undefined) { + accu.nodes[source] = createNode(source, source_label, source_type) + } + if (accu.nodes[target] === undefined) { + accu.nodes[target] = createNode(target, target_label, target_type) + } + return accu + }, + { nodes: {}, edges: {} } +) + +let edges = Object.values(graph.edges) +let nodes = Object.values(graph.nodes) + +const renderOptions: WebGL.Options = { + ...size, + x: Math.floor(size.width / 2), + y: Math.floor(size.width / 2), + zoom: 1, + minZoom: 0.1, + maxZoom: 2.5, + onNodeDrag: ({ nodeX: x, nodeY: y, target: { id } }) => { + nodes = nodes.map((node) => (node.id === id ? { ...node, x, y } : node)) + render({ nodes, edges, options: renderOptions }) + }, + onNodePointerEnter: ({ target: { id } }) => { + nodes = nodes.map((node) => (node.id === id ? { ...node, style: createNodeStyle(node.type, true) } : node)) + render({ nodes, edges, options: renderOptions }) + }, + onNodePointerLeave: ({ target: { id } }) => { + nodes = nodes.map((node) => (node.id === id ? { ...node, style: createNodeStyle(node.type) } : node)) + render({ nodes, edges, options: renderOptions }) + }, + onEdgePointerEnter: ({ target: { id } }) => { + edges = edges.map((edge) => (edge.id === id ? { ...edge, style: { ...edge.style, width: 3 } } : edge)) + render({ nodes, edges, options: renderOptions }) + }, + onEdgePointerLeave: ({ target: { id } }) => { + edges = edges.map((edge) => (edge.id === id ? { ...edge, style: { ...edge.style, width: 1 } } : edge)) + render({ nodes, edges, options: renderOptions }) + }, + onViewportDrag: ({ viewportX, viewportY }) => { + renderOptions.x = viewportX + renderOptions.y = viewportY + render({ nodes, edges, options: renderOptions }) + }, + onViewportWheel: ({ viewportX, viewportY, viewportZoom }) => { + renderOptions.x = viewportX + renderOptions.y = viewportY + renderOptions.zoom = viewportZoom + render({ nodes, edges, options: renderOptions }) + } +} + +/** + * Layout and Render Graph + */ +zoomControl({ + top: 80, + onZoomIn: () => { + renderOptions.zoom = Zoom.clampZoom(renderOptions.minZoom!, renderOptions.maxZoom!, renderOptions.zoom! / 0.6) + render({ nodes, edges, options: renderOptions }) + }, + onZoomOut: () => { + renderOptions.zoom = Zoom.clampZoom(renderOptions.minZoom!, renderOptions.maxZoom!, renderOptions.zoom! * 0.6) + render({ nodes, edges, options: renderOptions }) + } +}) + +const layoutData = hierarchy(root, { nodes, edges, options }) +nodes = layoutData.nodes +edges = layoutData.edges + +const bounds = Graph.getSelectionBounds(nodes, VIEWPORT_PADDING) + +const right = bounds.right + nodeSize[1] +const treeWidth = right - bounds.left + +renderOptions.zoom = size.width / treeWidth +renderOptions.x = treeWidth / 2 - right +renderOptions.y = bounds.top - size.height / 2 + +render({ nodes, edges, options: renderOptions }) From 9485e1a6b61741a788e237288ccab3fd8579a082 Mon Sep 17 00:00:00 2001 From: Mikey Gower Date: Wed, 20 Sep 2023 11:31:54 -0400 Subject: [PATCH 15/22] allow for multiple sort function --- examples/tidy-tree/index.ts | 34 +++++++++----- src/layout/hierarchy/index.ts | 86 ++++++++++++++++++++--------------- 2 files changed, 71 insertions(+), 49 deletions(-) diff --git a/examples/tidy-tree/index.ts b/examples/tidy-tree/index.ts index 3f9698f8..f6de16f7 100644 --- a/examples/tidy-tree/index.ts +++ b/examples/tidy-tree/index.ts @@ -36,7 +36,10 @@ const options: Hierarchy.Options = { nodeSize, anchor: 'left', alignment: 'min', - sort: (a, b) => b.height - a.height + sort: [ + (a, b) => b.height - a.height, + ({ data: a }, { data: b }) => (a.node.type === 'company' ? 1 : 0) - (b.node.type === 'company' ? 1 : 0) + ] } /** @@ -75,6 +78,17 @@ const createEdge = (id: string, source: string, target: string, field: string): style: { arrow: 'none' } }) +const getTreeViewport = (nodes: Node[]) => { + const bounds = Graph.getSelectionBounds(nodes, VIEWPORT_PADDING) + const right = bounds.right + nodeSize[1] + const treeWidth = right - bounds.left + return { + zoom: size.width / treeWidth, + x: treeWidth / 2 - right, + y: bounds.top - size.height / 2 + } +} + const root = '875yxpVvxV2RsweKMRiu7g' const graph = data.reduce<{ nodes: Record; edges: Record }>( (accu, { source, source_label, source_type, target, target_label, target_type, field }) => { @@ -151,17 +165,13 @@ zoomControl({ } }) -const layoutData = hierarchy(root, { nodes, edges, options }) -nodes = layoutData.nodes -edges = layoutData.edges - -const bounds = Graph.getSelectionBounds(nodes, VIEWPORT_PADDING) - -const right = bounds.right + nodeSize[1] -const treeWidth = right - bounds.left +const layout = hierarchy(root, { nodes, edges, options }) +nodes = layout.nodes +edges = layout.edges -renderOptions.zoom = size.width / treeWidth -renderOptions.x = treeWidth / 2 - right -renderOptions.y = bounds.top - size.height / 2 +const viewport = getTreeViewport(nodes) +renderOptions.zoom = viewport.zoom +renderOptions.x = viewport.x +renderOptions.y = viewport.y render({ nodes, edges, options: renderOptions }) diff --git a/src/layout/hierarchy/index.ts b/src/layout/hierarchy/index.ts index c2d7abc6..87c8fc0c 100644 --- a/src/layout/hierarchy/index.ts +++ b/src/layout/hierarchy/index.ts @@ -1,8 +1,10 @@ import type { Node, Edge, Placement } from '../../trellis' import { hierarchyToGraph, createGraphIndex, graphToHierarchy, HierarchyData } from './utils' -import { HierarchyNode, HierarchyPointNode } from 'd3-hierarchy' +import { HierarchyNode } from 'd3-hierarchy' import tree from './tree' +type CompareFn = (a: HierarchyNode>, b: HierarchyNode>) => number + export type Options = Partial<{ x: number y: number @@ -11,74 +13,84 @@ export type Options = Partial<{ alignment: 'min' | 'mid' | 'max' size: [number, number] nodeSize: [number, number] - separation: (a: HierarchyPointNode>, b: HierarchyPointNode>) => number - sort: (a: HierarchyNode>, b: HierarchyNode>) => number + separation: CompareFn + sort: CompareFn | CompareFn[] }> const DEFAULT_NODE_SIZE: [number, number] = [120, 240] export const Layout = () => { - return (rootId: string, graph: { nodes: N[]; edges: E[]; options?: Options }) => { + return ( + rootId: string, + { options = {}, ...graph }: { nodes: N[]; edges: E[]; options?: Options } + ) => { const index = createGraphIndex(graph) if (index[rootId] === undefined) { return { nodes: graph.nodes, edges: graph.edges } } - const hierarchy = graphToHierarchy(index, rootId, graph.options?.bfs) + const hierarchy = graphToHierarchy(index, rootId, options?.bfs) - if (graph.options?.sort !== undefined) { - hierarchy.sort(graph.options.sort) + if (Array.isArray(options.sort)) { + options.sort.forEach((sort) => { + hierarchy.sort(sort) + }) + } else if (options.sort !== undefined) { + hierarchy.sort(options.sort) } const layout = tree>() + const nodeSize = options.nodeSize ?? DEFAULT_NODE_SIZE - const nodeSize = graph.options?.nodeSize ?? DEFAULT_NODE_SIZE - if (graph.options?.size !== undefined) { - layout.size(graph.options.size) + if (options.size !== undefined) { + layout.size(options.size) } else { layout.nodeSize(nodeSize) } - if (graph.options?.separation !== undefined) { - layout.separation(graph.options.separation) + if (options.separation !== undefined) { + layout.separation(options.separation) } - if (graph.options?.alignment !== undefined) { - layout.alignment(graph.options.alignment) + if (options.alignment !== undefined) { + layout.alignment(options.alignment) } const positionedDataById = hierarchyToGraph(layout(hierarchy)) - const { x = 0, y = 0 } = index[rootId].node - const xOffset = (graph.options?.x ?? 0) + x - const yOffset = (graph.options?.y ?? 0) - y + const width = options.size?.[0] ?? hierarchy.height * nodeSize[1] + const height = options.size?.[1] ?? hierarchy.height * nodeSize[0] + + const xOffset = (options.x ?? 0) + (index[rootId].node.x ?? 0) + const yOffset = (options.y ?? 0) - (index[rootId].node.y ?? 0) return { edges: graph.edges, nodes: graph.nodes.map((node) => { - const positionedNode = positionedDataById[node.id] - - if (positionedNode !== undefined) { - const x = positionedNode.x + xOffset - const y = positionedNode.y - yOffset - switch (graph.options?.anchor) { - case 'left': - // rotate tree 90 degrees by replacing x and y - return { ...node, y: x, x: y } - case 'right': - // rotate tree 90 degrees and flip on x axis by offsetting with tree width - return { ...node, y: x, x: hierarchy.height * nodeSize[1] - y } - case 'bottom': - // flip on y axis by offsetting with tree height - return { ...node, x, y: hierarchy.height * nodeSize[0] - y } - default: - // default to top - return { ...node, x, y } - } + const position = positionedDataById[node.id] + + if (position === undefined) { + return node } - return node + const x = position.x + xOffset + const y = position.y - yOffset + + switch (options.anchor) { + case 'left': + // rotate tree 90 degrees by replacing x and y + return { ...node, y: x, x: y } + case 'right': + // rotate tree 90 degrees and flip on x axis by offsetting with tree width + return { ...node, y: x, x: width - y } + case 'bottom': + // flip on y axis by offsetting with tree height + return { ...node, x, y: height - y } + default: + // default to top + return { ...node, x, y } + } }) } } From 94b8ed7d2eb3d396807280af334db2014cb0bb55 Mon Sep 17 00:00:00 2001 From: Mikey Gower Date: Fri, 29 Sep 2023 11:54:03 -0400 Subject: [PATCH 16/22] adjust build steps and rely on typescript --- README.md | 8 +++-- package-lock.json | 16 +++++----- package.json | 33 ++++++++++---------- src/renderers/webgl/annotations/rectangle.ts | 2 +- src/renderers/webgl/edge.ts | 2 +- src/renderers/webgl/index.ts | 2 +- src/renderers/webgl/node.ts | 2 +- tsconfig.json | 1 + 8 files changed, 36 insertions(+), 30 deletions(-) diff --git a/README.md b/README.md index 31578b96..85ee0963 100644 --- a/README.md +++ b/README.md @@ -66,7 +66,9 @@ npm version [premajor|preminor|prepatch|prerelease] --preid rc git push --follow-tags -npm publish --tag next +npm run copy + +npm publish dist/ --tag next ``` release @@ -78,5 +80,7 @@ npm version [major|minor|patch] git push --follow-tags -npm publish +npm run copy + +npm publish dist/ ``` diff --git a/package-lock.json b/package-lock.json index cb0794c2..202aa69a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@sayari/trellis", - "version": "0.7.0-rc.0", + "version": "v0.6.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@sayari/trellis", - "version": "0.7.0-rc.0", + "version": "v0.6.0", "license": "ISC", "dependencies": { "@pixi/unsafe-eval": "^6.5.5", @@ -5490,9 +5490,9 @@ } }, "node_modules/get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", "dev": true, "engines": { "node": "*" @@ -11784,9 +11784,9 @@ "optional": true }, "get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", "dev": true }, "get-port": { diff --git a/package.json b/package.json index cf6e4e04..dc0b1358 100644 --- a/package.json +++ b/package.json @@ -1,14 +1,11 @@ { "name": "@sayari/trellis", - "version": "0.7.0-rc.0", + "version": "v0.6.0", "description": "High-performance network visualization library, rendering to WebGL as well as other targets", "source": "src/index.ts", - "main": "./dist/main.js", - "module": "./dist/module.js", - "types": "./dist/index.d.ts", - "files": [ - "dist" - ], + "main": "./index.js", + "exports": "./index.js", + "types": "./index.d.ts", "scripts": { "clean": "rm -rf dist && rm -rf .parcel-cache", "format": "prettier . --write", @@ -19,11 +16,22 @@ "lint:fix": "eslint \"src/**/**.{ts,tsx}\" --fix", "perf": "parcel perf/index.html", "build:tsc": "tsc --project ./tsconfig.json", - "build": "npm run clean && parcel build && npm run build:tsc", + "build:umd": "parcel build --target umd", + "build": "npm run clean && npm run build:tsc && npm run build:umd", + "copy": "cp package* README.md LICENSE dist/", "examples:dev": "npm run clean && parcel examples/index.html", "docs:dev": "npm run clean && parcel docs-src/index.html", "docs:build": "rm -rf ./docs/ && parcel build ./docs-src/index.html --dist-dir docs/ --public-url https://sayari-analytics.github.io/trellis/ && cp ./docs-src/assets/og-image.png ./docs/" }, + "targets": { + "main": false, + "types": false, + "umd": { + "context": "browser", + "outputFormat": "global", + "distDir": "./dist/umd" + } + }, "author": "James Conkling jameslaneconkling.github.io", "license": "ISC", "dependencies": { @@ -74,14 +82,7 @@ "vite": "^4.4.9", "vitest": "^0.34.4" }, - "keywords": [ - "graph", - "network", - "infovis", - "visualization", - "react", - "webgl" - ], + "keywords": ["graph", "network", "infovis", "visualization", "react", "webgl"], "peerDependencies": { "react": ">=16.0" }, diff --git a/src/renderers/webgl/annotations/rectangle.ts b/src/renderers/webgl/annotations/rectangle.ts index 0f96b7b1..468f3fa7 100644 --- a/src/renderers/webgl/annotations/rectangle.ts +++ b/src/renderers/webgl/annotations/rectangle.ts @@ -77,7 +77,7 @@ export class RectangleAnnotationRenderer { private moveOffsetX = 0 private moveOffsetY = 0 - private doubleClickTimeout: number | undefined + private doubleClickTimeout: NodeJS.Timeout | undefined private doubleClick = false constructor(renderer: InternalRenderer, annotation: TextAnnotation | RectangleAnnotation) { diff --git a/src/renderers/webgl/edge.ts b/src/renderers/webgl/edge.ts index db7a93ef..5d96e551 100644 --- a/src/renderers/webgl/edge.ts +++ b/src/renderers/webgl/edge.ts @@ -54,7 +54,7 @@ export class EdgeRenderer { private curveControlPointA?: [number, number] private curveControlPointB?: [number, number] private curve: number = 0 - private doubleClickTimeout: number | undefined + private doubleClickTimeout: NodeJS.Timeout | undefined private doubleClick = false private labelLoader?: () => void diff --git a/src/renderers/webgl/index.ts b/src/renderers/webgl/index.ts index deb1fc1f..ff54963a 100644 --- a/src/renderers/webgl/index.ts +++ b/src/renderers/webgl/index.ts @@ -319,7 +319,7 @@ export class InternalRenderer { private interpolateZoom?: (time: number) => { value: number; done: boolean } private targetZoom = RENDERER_OPTIONS.zoom private firstRender = true - private doubleClickTimeout?: number + private doubleClickTimeout?: NodeJS.Timeout private doubleClick = false private onKeyDown = ({ altKey, ctrlKey, metaKey, shiftKey }: KeyboardEvent) => { this.altKey = altKey diff --git a/src/renderers/webgl/node.ts b/src/renderers/webgl/node.ts index 05e3b940..c056d116 100644 --- a/src/renderers/webgl/node.ts +++ b/src/renderers/webgl/node.ts @@ -77,7 +77,7 @@ export class NodeRenderer { private labelLoader?: () => void private iconLoader?: () => void private badgeIconLoader: (() => void)[] = [] - private doubleClickTimeout: number | undefined + private doubleClickTimeout: NodeJS.Timeout | undefined private doubleClick = false private nodeMoveXOffset: number = 0 private nodeMoveYOffset: number = 0 diff --git a/tsconfig.json b/tsconfig.json index e6e47c0f..6221997b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -13,6 +13,7 @@ "sourceMap": true /* Generates corresponding '.map' file. */, // "outFile": "./", /* Concatenate and emit output to single file. */ "outDir": "./dist" /* Redirect output structure to the directory. */, + "allowJs": true, // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ // "composite": true, /* Enable project compilation */ // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ From cdc1cba89f1d3bb8ad54d143f1263bdc2db95ae5 Mon Sep 17 00:00:00 2001 From: Mikey Gower Date: Fri, 29 Sep 2023 11:54:41 -0400 Subject: [PATCH 17/22] 0.6.1-rc.0 --- package-lock.json | 4 ++-- package.json | 11 +++++++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 202aa69a..8d33f9e7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@sayari/trellis", - "version": "v0.6.0", + "version": "0.6.1-rc.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@sayari/trellis", - "version": "v0.6.0", + "version": "0.6.1-rc.0", "license": "ISC", "dependencies": { "@pixi/unsafe-eval": "^6.5.5", diff --git a/package.json b/package.json index dc0b1358..d27a6e5f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@sayari/trellis", - "version": "v0.6.0", + "version": "0.6.1-rc.0", "description": "High-performance network visualization library, rendering to WebGL as well as other targets", "source": "src/index.ts", "main": "./index.js", @@ -82,7 +82,14 @@ "vite": "^4.4.9", "vitest": "^0.34.4" }, - "keywords": ["graph", "network", "infovis", "visualization", "react", "webgl"], + "keywords": [ + "graph", + "network", + "infovis", + "visualization", + "react", + "webgl" + ], "peerDependencies": { "react": ">=16.0" }, From c18e84ad66fe15634473c03a5989bf3c67529032 Mon Sep 17 00:00:00 2001 From: Mikey Gower Date: Fri, 29 Sep 2023 12:17:20 -0400 Subject: [PATCH 18/22] revert to umd entry file + ignored in ts --- package.json | 11 +- src/bindings/react/renderer.ts | 2 +- src/bindings/react/selection.ts | 2 +- src/index.ts | 412 ++++++++++++++++-- src/index.umd.ts | 33 ++ src/layout/cluster/index.ts | 2 +- src/layout/collide/index.ts | 2 +- src/layout/components/index.ts | 2 +- src/layout/fisheye/index.ts | 2 +- src/layout/force/index.ts | 2 +- src/layout/hierarchy/index.ts | 2 +- src/layout/hierarchy/utils.ts | 2 +- src/layout/radial/index.ts | 2 +- src/renderers/image/index.ts | 2 +- src/renderers/webgl/annotations/circle.ts | 2 +- src/renderers/webgl/annotations/rectangle.ts | 2 +- src/renderers/webgl/edge.ts | 2 +- src/renderers/webgl/index.ts | 2 +- src/renderers/webgl/interaction/decelerate.ts | 2 +- src/renderers/webgl/interaction/drag.ts | 2 +- src/renderers/webgl/interaction/zoom.ts | 2 +- src/renderers/webgl/node.ts | 2 +- src/renderers/webgl/sprites/arrowSprite.ts | 2 +- src/renderers/webgl/sprites/circleSprite.ts | 2 +- src/renderers/webgl/utils.ts | 2 +- src/trellis.ts | 383 ---------------- tsconfig.json | 3 +- 27 files changed, 440 insertions(+), 446 deletions(-) create mode 100644 src/index.umd.ts delete mode 100644 src/trellis.ts diff --git a/package.json b/package.json index d27a6e5f..d2acb717 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "@sayari/trellis", "version": "0.6.1-rc.0", "description": "High-performance network visualization library, rendering to WebGL as well as other targets", - "source": "src/index.ts", + "source": "src/index.umd.ts", "main": "./index.js", "exports": "./index.js", "types": "./index.d.ts", @@ -82,14 +82,7 @@ "vite": "^4.4.9", "vitest": "^0.34.4" }, - "keywords": [ - "graph", - "network", - "infovis", - "visualization", - "react", - "webgl" - ], + "keywords": ["graph", "network", "infovis", "visualization", "react", "webgl"], "peerDependencies": { "react": ">=16.0" }, diff --git a/src/bindings/react/renderer.ts b/src/bindings/react/renderer.ts index c84eb586..6d14e2e4 100644 --- a/src/bindings/react/renderer.ts +++ b/src/bindings/react/renderer.ts @@ -1,6 +1,6 @@ import { createElement, useRef, useEffect } from 'react' import { Renderer as PixiRenderer, Options } from '../../renderers/webgl' -import { Node, Edge, Annotation } from '../../trellis' +import { Node, Edge, Annotation } from '../..' import Stats from 'stats.js' export type Props = Partial> & { diff --git a/src/bindings/react/selection.ts b/src/bindings/react/selection.ts index 602a5d14..705d28eb 100644 --- a/src/bindings/react/selection.ts +++ b/src/bindings/react/selection.ts @@ -1,6 +1,6 @@ import { ReactNode, useCallback, useEffect, useRef, useState } from 'react' import { ViewportDragDecelerateEvent, ViewportDragEvent } from '../../renderers/webgl' -import { Annotation, Node } from '../../trellis' +import { Annotation, Node } from '../..' export type SelectionChangeEvent = { type: 'selectionChange' diff --git a/src/index.ts b/src/index.ts index e33461bb..08695b27 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,33 +1,383 @@ -import * as Cluster from './layout/cluster' -import * as Force from './layout/force' -import * as Hierarchy from './layout/hierarchy' -import * as Collide from './layout/collide' -import * as Components from './layout/components' -import * as Fisheye from './layout/fisheye' -import * as WebGL from './renderers/webgl' -import * as ReactWebGLBindings from './bindings/react/renderer' -import * as ReactSelectionBindings from './bindings/react/selection' -import * as ReactZoomBindings from './bindings/react/zoom' -import * as NativeDownloadBindings from './bindings/native/download' -import * as NativeSelectionBindings from './bindings/native/selection' -import * as NativeZoomBindings from './bindings/native/zoom' -import * as Image from './renderers/image' - -export * from './trellis' - -export const layout = { Cluster, Force, Hierarchy, Fisheye, Collide, Components } - -export const renderers = { WebGL, Image } - -export const bindings = { - react: { - Renderer: ReactWebGLBindings, - Selection: ReactSelectionBindings, - Zoom: ReactZoomBindings - }, - native: { - Download: NativeDownloadBindings, - Selection: NativeSelectionBindings, - Zoom: NativeZoomBindings +export type Node = { + id: string + radius: number + x?: number + y?: number + fx?: number + fy?: number + label?: string + style?: NodeStyle + subgraph?: { + nodes: Node[] + edges: Edge[] + options?: {} } } + +export type Edge = { + id: string + source: string + target: string + label?: string + style?: EdgeStyle +} + +export type TextIcon = { + type: 'textIcon' + family: string + text: string + color: string + size: number +} + +export type ImageIcon = { + type: 'imageIcon' + url: string + scale?: number + offsetX?: number + offsetY?: number +} + +export type Placement = 'top' | 'bottom' | 'left' | 'right' + +export type LabelStyle = Partial<{ + color: string + fontFamily: string + fontSize: number + wordWrap: number + background: string + backgroundOpacity: number + placement: Placement +}> + +export type NodeStyle = { + color?: string + icon?: TextIcon | ImageIcon + stroke?: { + color?: string + width?: number + }[] + badge?: { + position: number + radius?: number + color?: string + stroke?: string + strokeWidth?: number + icon?: TextIcon | ImageIcon + }[] + label?: LabelStyle +} + +export type EdgeStyle = { + width?: number + stroke?: string + strokeOpacity?: number + arrow?: 'forward' | 'reverse' | 'both' | 'none' + label?: LabelStyle +} + +export type CircleAnnotation = { + type: 'circle' + id: string + x: number + y: number + radius: number + style: { + backgroundColor: string + stroke: { + color: string + width: number + } + } +} + +export type RectangleAnnotation = { + type: 'rectangle' + id: string + x: number + y: number + width: number + height: number + resize?: boolean + style: { + backgroundColor: string + stroke: { + color: string + width: number + } + } +} + +export type TextAnnotation = { + type: 'text' + id: string + x: number + y: number + width: number + height: number + content: string + resize?: boolean + style: Partial<{ + backgroundColor: string + padding: number + stroke: { + color: string + width: number + } + text: Partial<{ + fontName: string + fontSize: number + fontWeight: 'normal' | 'bold' | 'bolder' | 'lighter' | '100' | '200' | '300' | '400' | '500' | '600' | '700' | '800' | '900' + fontStyle: 'normal' | 'italic' | 'oblique' + weight: string + color: string + align: 'left' | 'center' | 'right' | 'justify' + letterSpacing: number + lineSpacing: number + maxWidth: number + }> + }> +} + +export type Annotation = CircleAnnotation | RectangleAnnotation | TextAnnotation + +export type Bounds = { + left: number + top: number + right: number + bottom: number +} + +export type Dimensions = { width: number; height: number } + +export type Viewport = { x: number; y: number; zoom: number } + +export const getSelectionBounds = (elements: (Node | Annotation)[], padding: number = 0): Bounds => { + let left = 0 + let top = 0 + let right = 0 + let bottom = 0 + + for (const el of elements) { + if ('radius' in el) { + const elementLeft = (el.x ?? 0) - el.radius + const elementTop = (el.y ?? 0) - el.radius + const elementRight = (el.x ?? 0) + el.radius + const elementBottom = (el.y ?? 0) + el.radius + if (elementLeft < left) left = elementLeft + if (elementTop < top) top = elementTop + if (elementRight > right) right = elementRight + if (elementBottom > bottom) bottom = elementBottom + } else if ('width' in el && 'height' in el) { + const elementLeft = el.x ?? 0 + const elementTop = el.y ?? 0 + const elementRight = (el.x ?? 0) + el.width + const elementBottom = (el.x ?? 0) + el.height + if (elementLeft < left) left = elementLeft + if (elementTop < top) top = elementTop + if (elementRight > right) right = elementRight + if (elementBottom > bottom) bottom = elementBottom + } + } + + return { + left: left - padding, + top: top - padding, + right: right + padding, + bottom: bottom + padding + } +} + +export const mergeBounds = (a: Bounds, b: Bounds, padding: number = 0): Bounds => { + return { + left: Math.min(a.left, b.left) - padding, + top: Math.min(a.top, b.top) - padding, + right: Math.max(a.right, b.right) + padding, + bottom: Math.max(a.bottom, b.bottom) + padding + } +} + +export const viewportToBounds = ({ x, y, zoom }: Viewport, { width, height }: Dimensions): Bounds => { + const xOffset = width / 2 / zoom + const yOffset = height / 2 / zoom + return { + left: -(x + xOffset), + top: -(y + yOffset), + right: -(x - xOffset), + bottom: -(y - yOffset) + } +} + +export const boundsToViewport = ({ left, top, right, bottom }: Bounds, { width, height }: Dimensions): Viewport => { + const targetWidth = right - left + const targetHeight = bottom - top + const x = targetWidth / 2 - right + const y = targetHeight / 2 - bottom + + if (targetWidth / targetHeight > width / height) { + // fit to width + return { x, y, zoom: width / targetWidth } + } else { + // fit to height + return { x, y, zoom: height / targetHeight } + } +} + +export const boundsToDimensions = ({ left, top, right, bottom }: Bounds, zoom: number): Dimensions => { + return { + width: (right - left) / zoom, + height: (bottom - top) / zoom + } +} + +export const clamp = (min: number, max: number, value: number) => Math.max(min, Math.min(max, value)) + +export const equals = (a: T, b: T) => { + if (a === b) { + return true + } else if (Array.isArray(a) && Array.isArray(b)) { + if (a.length !== b.length) { + return false + } + + for (let i = 0; i < a.length; i++) { + if (!equals(a[i], b[i])) { + return false + } + } + + return true + } else if (typeof a === 'object' && typeof b === 'object') { + if (Object.keys(a ?? {}).length !== Object.keys(b ?? {}).length) { + return false + } + + for (const key in a) { + if (!equals(a[key], b?.[key])) { + return false + } + } + + return true + } + + return false +} + +export const connectedComponents = (graph: { nodes: N[]; edges: E[] }): { nodes: N[]; edges: E[] }[] => { + const adjacencyList: Record> = {} + const nodes: Record = {} + const visited = new Set() + const components: { nodes: Record; edges: Record }[] = [] + + for (const edge of graph.edges) { + if (adjacencyList[edge.source] === undefined) { + adjacencyList[edge.source] = {} + } + if (adjacencyList[edge.source][edge.target] === undefined) { + adjacencyList[edge.source][edge.target] = [] + } + if (adjacencyList[edge.target] === undefined) { + adjacencyList[edge.target] = {} + } + if (adjacencyList[edge.target][edge.source] === undefined) { + adjacencyList[edge.target][edge.source] = [] + } + + adjacencyList[edge.source][edge.target].push(edge) + adjacencyList[edge.target][edge.source].push(edge) + } + + for (const node of graph.nodes) { + nodes[node.id] = node + } + + for (const { id } of graph.nodes) { + if (visited.has(id)) { + continue + } + + visited.add(id) + const toVisit = [id] + const component: { nodes: Record; edges: Record } = { + nodes: { [id]: nodes[id] }, + edges: {} + } + + while (toVisit.length > 0) { + const next = adjacencyList[toVisit.pop()!] + if (next === undefined) { + continue + } + + for (const [adjacentNode, edges] of Object.entries(next)) { + for (const edge of edges) { + component.edges[edge.id] = edge + } + component.nodes[adjacentNode] = nodes[adjacentNode] + + if (!visited.has(adjacentNode)) { + toVisit.push(adjacentNode) + visited.add(adjacentNode) + } + } + } + + components.push(component) + } + + return components.map(({ nodes, edges }) => ({ + nodes: Object.values(nodes), + edges: Object.values(edges) + })) +} + +export function* bfs( + predicate: (node: N) => boolean, + graph: { nodes: N[]; edges: E[] } +): Generator { + const adjacencyList: Record = {} + const nodes: Record = {} + const visited = new Set() + const queue = [graph.nodes[0].id] + + for (const edge of graph.edges) { + if (adjacencyList[edge.source] === undefined) { + adjacencyList[edge.source] = [] + } + if (adjacencyList[edge.target] === undefined) { + adjacencyList[edge.target] = [] + } + + adjacencyList[edge.source].push(edge.target) + adjacencyList[edge.target].push(edge.source) + } + + for (const node of graph.nodes) { + nodes[node.id] = node + } + + while (queue.length > 0) { + const node = queue.shift()! + + if (visited.has(node)) { + continue + } + + visited.add(node) + + if (predicate(nodes[node])) { + yield nodes[node] + } + + if (adjacencyList[node]) { + for (const adjacentNode of adjacencyList[node]) { + if (!visited.has(adjacentNode)) { + queue.push(adjacentNode) + } + } + } + } +} + +export const distance = (x0: number, y0: number, x1: number, y1: number) => Math.hypot(x1 - x0, y1 - y0) diff --git a/src/index.umd.ts b/src/index.umd.ts new file mode 100644 index 00000000..5c62afe3 --- /dev/null +++ b/src/index.umd.ts @@ -0,0 +1,33 @@ +import * as Cluster from './layout/cluster' +import * as Force from './layout/force' +import * as Hierarchy from './layout/hierarchy' +import * as Collide from './layout/collide' +import * as Components from './layout/components' +import * as Fisheye from './layout/fisheye' +import * as WebGL from './renderers/webgl' +import * as ReactWebGLBindings from './bindings/react/renderer' +import * as ReactSelectionBindings from './bindings/react/selection' +import * as ReactZoomBindings from './bindings/react/zoom' +import * as NativeDownloadBindings from './bindings/native/download' +import * as NativeSelectionBindings from './bindings/native/selection' +import * as NativeZoomBindings from './bindings/native/zoom' +import * as Image from './renderers/image' + +export * from '.' + +export const layout = { Cluster, Force, Hierarchy, Fisheye, Collide, Components } + +export const renderers = { WebGL, Image } + +export const bindings = { + react: { + Renderer: ReactWebGLBindings, + Selection: ReactSelectionBindings, + Zoom: ReactZoomBindings + }, + native: { + Download: NativeDownloadBindings, + Selection: NativeSelectionBindings, + Zoom: NativeZoomBindings + } +} diff --git a/src/layout/cluster/index.ts b/src/layout/cluster/index.ts index 098027dd..665f9408 100644 --- a/src/layout/cluster/index.ts +++ b/src/layout/cluster/index.ts @@ -1,5 +1,5 @@ import { pack, hierarchy } from 'd3-hierarchy' -import { Node } from '../../trellis' +import { Node } from '../..' export const Layout = () => { return (nodes: N[]) => { diff --git a/src/layout/collide/index.ts b/src/layout/collide/index.ts index e300f5b0..d9c1da66 100644 --- a/src/layout/collide/index.ts +++ b/src/layout/collide/index.ts @@ -1,5 +1,5 @@ import { forceCollide, forceSimulation, SimulationNodeDatum } from 'd3-force' -import { Node, Edge } from '../../trellis' +import { Node, Edge } from '../..' export type Options = Partial<{ nodePadding: number diff --git a/src/layout/components/index.ts b/src/layout/components/index.ts index 71709a67..869f4d65 100644 --- a/src/layout/components/index.ts +++ b/src/layout/components/index.ts @@ -1,5 +1,5 @@ import { packEnclose, packSiblings } from 'd3-hierarchy' -import { Node, Edge, connectedComponents } from '../../trellis' +import { Node, Edge, connectedComponents } from '../..' export type Options = Partial<{ padding: number diff --git a/src/layout/fisheye/index.ts b/src/layout/fisheye/index.ts index a0830cd9..d320748b 100644 --- a/src/layout/fisheye/index.ts +++ b/src/layout/fisheye/index.ts @@ -1,4 +1,4 @@ -import { Node } from '../../trellis' +import { Node } from '../..' export const Layout = () => { return (previousNodes: N[], nextNodes: N[]) => { diff --git a/src/layout/force/index.ts b/src/layout/force/index.ts index b058a97a..86729da9 100644 --- a/src/layout/force/index.ts +++ b/src/layout/force/index.ts @@ -12,7 +12,7 @@ import { SimulationNodeDatum } from 'd3-force' import { Extend } from '../../types' -import { Node, Edge } from '../../trellis' +import { Node, Edge } from '../..' export type Options = Partial<{ nodeStrength: number diff --git a/src/layout/hierarchy/index.ts b/src/layout/hierarchy/index.ts index 87c8fc0c..38408e28 100644 --- a/src/layout/hierarchy/index.ts +++ b/src/layout/hierarchy/index.ts @@ -1,4 +1,4 @@ -import type { Node, Edge, Placement } from '../../trellis' +import type { Node, Edge, Placement } from '../..' import { hierarchyToGraph, createGraphIndex, graphToHierarchy, HierarchyData } from './utils' import { HierarchyNode } from 'd3-hierarchy' import tree from './tree' diff --git a/src/layout/hierarchy/utils.ts b/src/layout/hierarchy/utils.ts index 0b5b78ec..fe4486e8 100644 --- a/src/layout/hierarchy/utils.ts +++ b/src/layout/hierarchy/utils.ts @@ -1,5 +1,5 @@ import { hierarchy, HierarchyPointNode } from 'd3-hierarchy' -import type { Node, Edge } from '../../trellis' +import type { Node, Edge } from '../..' // types export type TreePath = { edge: E; node: N } diff --git a/src/layout/radial/index.ts b/src/layout/radial/index.ts index 9af67b7f..7d564afc 100644 --- a/src/layout/radial/index.ts +++ b/src/layout/radial/index.ts @@ -1,5 +1,5 @@ import * as Hierarchy from '../hierarchy' -import { Node, Edge } from '../../trellis' +import { Node, Edge } from '../..' export type Options = Partial<{ x: number diff --git a/src/renderers/image/index.ts b/src/renderers/image/index.ts index 7c17d1c0..735e86f7 100644 --- a/src/renderers/image/index.ts +++ b/src/renderers/image/index.ts @@ -1,5 +1,5 @@ import * as WebGL from '../webgl' -import { Node, Edge, Annotation } from '../../trellis' +import { Node, Edge, Annotation } from '../..' export type Options = { width?: number diff --git a/src/renderers/webgl/annotations/circle.ts b/src/renderers/webgl/annotations/circle.ts index 6084eaa2..51114528 100644 --- a/src/renderers/webgl/annotations/circle.ts +++ b/src/renderers/webgl/annotations/circle.ts @@ -1,6 +1,6 @@ import * as PIXI from 'pixi.js-legacy' import { InternalRenderer } from '..' -import { CircleAnnotation } from '../../../trellis' +import { CircleAnnotation } from '../../..' import { colorToNumber } from '../utils' export class CircleAnnotationRenderer { diff --git a/src/renderers/webgl/annotations/rectangle.ts b/src/renderers/webgl/annotations/rectangle.ts index 468f3fa7..8125cab3 100644 --- a/src/renderers/webgl/annotations/rectangle.ts +++ b/src/renderers/webgl/annotations/rectangle.ts @@ -1,6 +1,6 @@ import * as PIXI from 'pixi.js-legacy' import { InternalRenderer } from '..' -import { RectangleAnnotation, TextAnnotation } from '../../../trellis' +import { RectangleAnnotation, TextAnnotation } from '../../..' import { clientPositionFromEvent, colorToNumber, pointerKeysFromEvent } from '../utils' const DEFAULT_PADDING = 4 diff --git a/src/renderers/webgl/edge.ts b/src/renderers/webgl/edge.ts index 5d96e551..1dc7bda4 100644 --- a/src/renderers/webgl/edge.ts +++ b/src/renderers/webgl/edge.ts @@ -12,7 +12,7 @@ import { clientPositionFromEvent, pointerKeysFromEvent } from './utils' -import { Node, Edge, EdgeStyle } from '../../trellis' +import { Node, Edge, EdgeStyle } from '../..' import { ArrowSprite } from './sprites/arrowSprite' const LINE_HOVER_RADIUS = 4 diff --git a/src/renderers/webgl/index.ts b/src/renderers/webgl/index.ts index ff54963a..e0dd97c0 100644 --- a/src/renderers/webgl/index.ts +++ b/src/renderers/webgl/index.ts @@ -1,7 +1,7 @@ import Stats from 'stats.js' import * as PIXI from 'pixi.js-legacy' import { install } from '@pixi/unsafe-eval' -import * as Graph from '../../trellis' +import * as Graph from '../..' import { animationFrameLoop, interpolate } from '../../utils' import { NodeRenderer } from './node' import { EdgeRenderer } from './edge' diff --git a/src/renderers/webgl/interaction/decelerate.ts b/src/renderers/webgl/interaction/decelerate.ts index 0c2fffa7..074cb5e3 100644 --- a/src/renderers/webgl/interaction/decelerate.ts +++ b/src/renderers/webgl/interaction/decelerate.ts @@ -1,5 +1,5 @@ import { InternalRenderer } from '..' -import { Node, Edge } from '../../../trellis' +import { Node, Edge } from '../../..' /** * deceleration logic is based largely on the excellent [pixi-viewport](https://github.com/davidfig/pixi-viewport) diff --git a/src/renderers/webgl/interaction/drag.ts b/src/renderers/webgl/interaction/drag.ts index f51eee53..9499b2c4 100644 --- a/src/renderers/webgl/interaction/drag.ts +++ b/src/renderers/webgl/interaction/drag.ts @@ -1,6 +1,6 @@ import * as PIXI from 'pixi.js-legacy' import { InternalRenderer } from '..' -import { Node, Edge } from '../../../trellis' +import { Node, Edge } from '../../..' import { clientPositionFromEvent } from '../utils' /** diff --git a/src/renderers/webgl/interaction/zoom.ts b/src/renderers/webgl/interaction/zoom.ts index 148359bf..13758ac4 100644 --- a/src/renderers/webgl/interaction/zoom.ts +++ b/src/renderers/webgl/interaction/zoom.ts @@ -1,6 +1,6 @@ import * as PIXI from 'pixi.js-legacy' import { InternalRenderer } from '..' -import { Node, Edge } from '../../../trellis' +import { Node, Edge } from '../../..' /** * zoom logic is based largely on the excellent [pixi-viewport](https://github.com/davidfig/pixi-viewport) diff --git a/src/renderers/webgl/node.ts b/src/renderers/webgl/node.ts index c056d116..9a8a9224 100644 --- a/src/renderers/webgl/node.ts +++ b/src/renderers/webgl/node.ts @@ -9,7 +9,7 @@ import { clientPositionFromEvent, pointerKeysFromEvent } from './utils' -import { Node, Edge, NodeStyle, equals, Placement } from '../../trellis' +import { Node, Edge, NodeStyle, equals, Placement } from '../..' import { interpolate } from '../../utils' import { CircleSprite } from './sprites/circleSprite' diff --git a/src/renderers/webgl/sprites/arrowSprite.ts b/src/renderers/webgl/sprites/arrowSprite.ts index 0dcbacf4..db7b05b1 100644 --- a/src/renderers/webgl/sprites/arrowSprite.ts +++ b/src/renderers/webgl/sprites/arrowSprite.ts @@ -1,6 +1,6 @@ import * as PIXI from 'pixi.js-legacy' import { InternalRenderer } from '..' -import { Node, Edge } from '../../../trellis' +import { Node, Edge } from '../../..' export class ArrowSprite { static ARROW_HEIGHT = 12 diff --git a/src/renderers/webgl/sprites/circleSprite.ts b/src/renderers/webgl/sprites/circleSprite.ts index 214fe3aa..05399e73 100644 --- a/src/renderers/webgl/sprites/circleSprite.ts +++ b/src/renderers/webgl/sprites/circleSprite.ts @@ -1,6 +1,6 @@ import * as PIXI from 'pixi.js-legacy' import { InternalRenderer } from '..' -import { Node, Edge } from '../../../trellis' +import { Node, Edge } from '../../..' export class CircleSprite { static radius = 500 diff --git a/src/renderers/webgl/utils.ts b/src/renderers/webgl/utils.ts index 7f230022..2353375f 100644 --- a/src/renderers/webgl/utils.ts +++ b/src/renderers/webgl/utils.ts @@ -1,7 +1,7 @@ import { color } from 'd3-color' import { InternalRenderer } from '.' import { NodeRenderer } from './node' -import { Node, Edge } from '../../trellis' +import { Node, Edge } from '../..' export const colorToNumber = (colorString: string): number => { const c = color(colorString) diff --git a/src/trellis.ts b/src/trellis.ts deleted file mode 100644 index 08695b27..00000000 --- a/src/trellis.ts +++ /dev/null @@ -1,383 +0,0 @@ -export type Node = { - id: string - radius: number - x?: number - y?: number - fx?: number - fy?: number - label?: string - style?: NodeStyle - subgraph?: { - nodes: Node[] - edges: Edge[] - options?: {} - } -} - -export type Edge = { - id: string - source: string - target: string - label?: string - style?: EdgeStyle -} - -export type TextIcon = { - type: 'textIcon' - family: string - text: string - color: string - size: number -} - -export type ImageIcon = { - type: 'imageIcon' - url: string - scale?: number - offsetX?: number - offsetY?: number -} - -export type Placement = 'top' | 'bottom' | 'left' | 'right' - -export type LabelStyle = Partial<{ - color: string - fontFamily: string - fontSize: number - wordWrap: number - background: string - backgroundOpacity: number - placement: Placement -}> - -export type NodeStyle = { - color?: string - icon?: TextIcon | ImageIcon - stroke?: { - color?: string - width?: number - }[] - badge?: { - position: number - radius?: number - color?: string - stroke?: string - strokeWidth?: number - icon?: TextIcon | ImageIcon - }[] - label?: LabelStyle -} - -export type EdgeStyle = { - width?: number - stroke?: string - strokeOpacity?: number - arrow?: 'forward' | 'reverse' | 'both' | 'none' - label?: LabelStyle -} - -export type CircleAnnotation = { - type: 'circle' - id: string - x: number - y: number - radius: number - style: { - backgroundColor: string - stroke: { - color: string - width: number - } - } -} - -export type RectangleAnnotation = { - type: 'rectangle' - id: string - x: number - y: number - width: number - height: number - resize?: boolean - style: { - backgroundColor: string - stroke: { - color: string - width: number - } - } -} - -export type TextAnnotation = { - type: 'text' - id: string - x: number - y: number - width: number - height: number - content: string - resize?: boolean - style: Partial<{ - backgroundColor: string - padding: number - stroke: { - color: string - width: number - } - text: Partial<{ - fontName: string - fontSize: number - fontWeight: 'normal' | 'bold' | 'bolder' | 'lighter' | '100' | '200' | '300' | '400' | '500' | '600' | '700' | '800' | '900' - fontStyle: 'normal' | 'italic' | 'oblique' - weight: string - color: string - align: 'left' | 'center' | 'right' | 'justify' - letterSpacing: number - lineSpacing: number - maxWidth: number - }> - }> -} - -export type Annotation = CircleAnnotation | RectangleAnnotation | TextAnnotation - -export type Bounds = { - left: number - top: number - right: number - bottom: number -} - -export type Dimensions = { width: number; height: number } - -export type Viewport = { x: number; y: number; zoom: number } - -export const getSelectionBounds = (elements: (Node | Annotation)[], padding: number = 0): Bounds => { - let left = 0 - let top = 0 - let right = 0 - let bottom = 0 - - for (const el of elements) { - if ('radius' in el) { - const elementLeft = (el.x ?? 0) - el.radius - const elementTop = (el.y ?? 0) - el.radius - const elementRight = (el.x ?? 0) + el.radius - const elementBottom = (el.y ?? 0) + el.radius - if (elementLeft < left) left = elementLeft - if (elementTop < top) top = elementTop - if (elementRight > right) right = elementRight - if (elementBottom > bottom) bottom = elementBottom - } else if ('width' in el && 'height' in el) { - const elementLeft = el.x ?? 0 - const elementTop = el.y ?? 0 - const elementRight = (el.x ?? 0) + el.width - const elementBottom = (el.x ?? 0) + el.height - if (elementLeft < left) left = elementLeft - if (elementTop < top) top = elementTop - if (elementRight > right) right = elementRight - if (elementBottom > bottom) bottom = elementBottom - } - } - - return { - left: left - padding, - top: top - padding, - right: right + padding, - bottom: bottom + padding - } -} - -export const mergeBounds = (a: Bounds, b: Bounds, padding: number = 0): Bounds => { - return { - left: Math.min(a.left, b.left) - padding, - top: Math.min(a.top, b.top) - padding, - right: Math.max(a.right, b.right) + padding, - bottom: Math.max(a.bottom, b.bottom) + padding - } -} - -export const viewportToBounds = ({ x, y, zoom }: Viewport, { width, height }: Dimensions): Bounds => { - const xOffset = width / 2 / zoom - const yOffset = height / 2 / zoom - return { - left: -(x + xOffset), - top: -(y + yOffset), - right: -(x - xOffset), - bottom: -(y - yOffset) - } -} - -export const boundsToViewport = ({ left, top, right, bottom }: Bounds, { width, height }: Dimensions): Viewport => { - const targetWidth = right - left - const targetHeight = bottom - top - const x = targetWidth / 2 - right - const y = targetHeight / 2 - bottom - - if (targetWidth / targetHeight > width / height) { - // fit to width - return { x, y, zoom: width / targetWidth } - } else { - // fit to height - return { x, y, zoom: height / targetHeight } - } -} - -export const boundsToDimensions = ({ left, top, right, bottom }: Bounds, zoom: number): Dimensions => { - return { - width: (right - left) / zoom, - height: (bottom - top) / zoom - } -} - -export const clamp = (min: number, max: number, value: number) => Math.max(min, Math.min(max, value)) - -export const equals = (a: T, b: T) => { - if (a === b) { - return true - } else if (Array.isArray(a) && Array.isArray(b)) { - if (a.length !== b.length) { - return false - } - - for (let i = 0; i < a.length; i++) { - if (!equals(a[i], b[i])) { - return false - } - } - - return true - } else if (typeof a === 'object' && typeof b === 'object') { - if (Object.keys(a ?? {}).length !== Object.keys(b ?? {}).length) { - return false - } - - for (const key in a) { - if (!equals(a[key], b?.[key])) { - return false - } - } - - return true - } - - return false -} - -export const connectedComponents = (graph: { nodes: N[]; edges: E[] }): { nodes: N[]; edges: E[] }[] => { - const adjacencyList: Record> = {} - const nodes: Record = {} - const visited = new Set() - const components: { nodes: Record; edges: Record }[] = [] - - for (const edge of graph.edges) { - if (adjacencyList[edge.source] === undefined) { - adjacencyList[edge.source] = {} - } - if (adjacencyList[edge.source][edge.target] === undefined) { - adjacencyList[edge.source][edge.target] = [] - } - if (adjacencyList[edge.target] === undefined) { - adjacencyList[edge.target] = {} - } - if (adjacencyList[edge.target][edge.source] === undefined) { - adjacencyList[edge.target][edge.source] = [] - } - - adjacencyList[edge.source][edge.target].push(edge) - adjacencyList[edge.target][edge.source].push(edge) - } - - for (const node of graph.nodes) { - nodes[node.id] = node - } - - for (const { id } of graph.nodes) { - if (visited.has(id)) { - continue - } - - visited.add(id) - const toVisit = [id] - const component: { nodes: Record; edges: Record } = { - nodes: { [id]: nodes[id] }, - edges: {} - } - - while (toVisit.length > 0) { - const next = adjacencyList[toVisit.pop()!] - if (next === undefined) { - continue - } - - for (const [adjacentNode, edges] of Object.entries(next)) { - for (const edge of edges) { - component.edges[edge.id] = edge - } - component.nodes[adjacentNode] = nodes[adjacentNode] - - if (!visited.has(adjacentNode)) { - toVisit.push(adjacentNode) - visited.add(adjacentNode) - } - } - } - - components.push(component) - } - - return components.map(({ nodes, edges }) => ({ - nodes: Object.values(nodes), - edges: Object.values(edges) - })) -} - -export function* bfs( - predicate: (node: N) => boolean, - graph: { nodes: N[]; edges: E[] } -): Generator { - const adjacencyList: Record = {} - const nodes: Record = {} - const visited = new Set() - const queue = [graph.nodes[0].id] - - for (const edge of graph.edges) { - if (adjacencyList[edge.source] === undefined) { - adjacencyList[edge.source] = [] - } - if (adjacencyList[edge.target] === undefined) { - adjacencyList[edge.target] = [] - } - - adjacencyList[edge.source].push(edge.target) - adjacencyList[edge.target].push(edge.source) - } - - for (const node of graph.nodes) { - nodes[node.id] = node - } - - while (queue.length > 0) { - const node = queue.shift()! - - if (visited.has(node)) { - continue - } - - visited.add(node) - - if (predicate(nodes[node])) { - yield nodes[node] - } - - if (adjacencyList[node]) { - for (const adjacentNode of adjacencyList[node]) { - if (!visited.has(adjacentNode)) { - queue.push(adjacentNode) - } - } - } - } -} - -export const distance = (x0: number, y0: number, x1: number, y1: number) => Math.hypot(x1 - x0, y1 - y0) diff --git a/tsconfig.json b/tsconfig.json index 6221997b..bd11113f 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -61,5 +61,6 @@ // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ }, - "include": ["src/**/*"] + "include": ["src/**/*"], + "exclude": ["src/index.umd.ts"] } From 873148d6bbf10f3a8655d2d8847542322f197e75 Mon Sep 17 00:00:00 2001 From: Mikey Gower Date: Fri, 29 Sep 2023 12:19:09 -0400 Subject: [PATCH 19/22] 0.6.1-rc.1 --- package-lock.json | 4 ++-- package.json | 11 +++++++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8d33f9e7..fa5f7546 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@sayari/trellis", - "version": "0.6.1-rc.0", + "version": "0.6.1-rc.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@sayari/trellis", - "version": "0.6.1-rc.0", + "version": "0.6.1-rc.1", "license": "ISC", "dependencies": { "@pixi/unsafe-eval": "^6.5.5", diff --git a/package.json b/package.json index d2acb717..04f12029 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@sayari/trellis", - "version": "0.6.1-rc.0", + "version": "0.6.1-rc.1", "description": "High-performance network visualization library, rendering to WebGL as well as other targets", "source": "src/index.umd.ts", "main": "./index.js", @@ -82,7 +82,14 @@ "vite": "^4.4.9", "vitest": "^0.34.4" }, - "keywords": ["graph", "network", "infovis", "visualization", "react", "webgl"], + "keywords": [ + "graph", + "network", + "infovis", + "visualization", + "react", + "webgl" + ], "peerDependencies": { "react": ">=16.0" }, From a7b8a9ba79c429788773355ca6c743a5eb1173e5 Mon Sep 17 00:00:00 2001 From: Mikey Gower Date: Fri, 29 Sep 2023 12:26:39 -0400 Subject: [PATCH 20/22] 0.6.1 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index fa5f7546..f9cb926a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@sayari/trellis", - "version": "0.6.1-rc.1", + "version": "0.6.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@sayari/trellis", - "version": "0.6.1-rc.1", + "version": "0.6.1", "license": "ISC", "dependencies": { "@pixi/unsafe-eval": "^6.5.5", diff --git a/package.json b/package.json index 04f12029..90d4d87a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@sayari/trellis", - "version": "0.6.1-rc.1", + "version": "0.6.1", "description": "High-performance network visualization library, rendering to WebGL as well as other targets", "source": "src/index.umd.ts", "main": "./index.js", From 57c34c192844c56a5fcfb55bd51900683ca8f884 Mon Sep 17 00:00:00 2001 From: Mikey Gower Date: Mon, 2 Oct 2023 12:13:44 -0400 Subject: [PATCH 21/22] resolve conflicts --- src/layout/hierarchy/index.ts | 4 ++-- src/renderers/webgl/index.ts | 2 +- src/renderers/webgl/node.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/layout/hierarchy/index.ts b/src/layout/hierarchy/index.ts index 38408e28..7e4a6b79 100644 --- a/src/layout/hierarchy/index.ts +++ b/src/layout/hierarchy/index.ts @@ -1,4 +1,4 @@ -import type { Node, Edge, Placement } from '../..' +import type { Node, Edge } from '../..' import { hierarchyToGraph, createGraphIndex, graphToHierarchy, HierarchyData } from './utils' import { HierarchyNode } from 'd3-hierarchy' import tree from './tree' @@ -9,7 +9,7 @@ export type Options = Partial<{ x: number y: number bfs: boolean - anchor: Placement + anchor: 'bottom' | 'left' | 'top' | 'right' alignment: 'min' | 'mid' | 'max' size: [number, number] nodeSize: [number, number] diff --git a/src/renderers/webgl/index.ts b/src/renderers/webgl/index.ts index 350b7b28..77b6494a 100644 --- a/src/renderers/webgl/index.ts +++ b/src/renderers/webgl/index.ts @@ -140,7 +140,7 @@ export class Renderer { nodeRenderersById: Record = {} edges: Graph.Edge[] = [] edgeRenderersById: Record = {} - #doubleClickTimeout?: number + #doubleClickTimeout?: NodeJS.Timeout #doubleClick = false #renderedPosition = false renderedNodes = false diff --git a/src/renderers/webgl/node.ts b/src/renderers/webgl/node.ts index 4def73b5..ee145bd0 100644 --- a/src/renderers/webgl/node.ts +++ b/src/renderers/webgl/node.ts @@ -16,7 +16,7 @@ export class NodeRenderer { strokes: NodeStrokes private renderer: Renderer - private doubleClickTimeout: number | undefined + private doubleClickTimeout: NodeJS.Timeout | undefined private doubleClick = false private nodeMoveXOffset: number = 0 private nodeMoveYOffset: number = 0 From f5bf6383fda9d1e40cded8230c69415779f1696e Mon Sep 17 00:00:00 2001 From: Mikey Gower Date: Mon, 2 Oct 2023 12:19:19 -0400 Subject: [PATCH 22/22] 0.7.0-rc.12 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8bcec1f4..09e32a09 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@sayari/trellis", - "version": "0.7.0-rc.11", + "version": "0.7.0-rc.12", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@sayari/trellis", - "version": "0.7.0-rc.11", + "version": "0.7.0-rc.12", "license": "ISC", "dependencies": { "@pixi/events": "^7.3.1", diff --git a/package.json b/package.json index 60e3d996..c9c07ebb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@sayari/trellis", - "version": "0.7.0-rc.11", + "version": "0.7.0-rc.12", "description": "High-performance network visualization library, rendering to WebGL as well as other targets", "main": "./index.js", "exports": "./index.js",