├── .editorconfig ├── .github ├── dependabot.yml ├── lychee.toml ├── renovate.json └── workflows │ ├── cloudflare-pages.yml │ ├── lychee.yml │ └── trunk-check.yml ├── .gitignore ├── .trunk ├── .gitignore ├── configs │ ├── .markdownlint.yaml │ └── .yamllint.yaml └── trunk.yaml ├── .vscode └── settings.json ├── LICENSE ├── docs ├── README.md └── images │ └── osint-framework.png ├── package.json ├── pnpm-lock.yaml └── public ├── arf.json ├── css └── arf.css ├── favicon ├── android-icon-144x144.png ├── android-icon-192x192.png ├── android-icon-36x36.png ├── android-icon-48x48.png ├── android-icon-72x72.png ├── android-icon-96x96.png ├── apple-icon-114x114.png ├── apple-icon-120x120.png ├── apple-icon-144x144.png ├── apple-icon-152x152.png ├── apple-icon-180x180.png ├── apple-icon-57x57.png ├── apple-icon-60x60.png ├── apple-icon-72x72.png ├── apple-icon-76x76.png ├── apple-icon-precomposed.png ├── apple-icon.png ├── browserconfig.xml ├── favicon-16x16.png ├── favicon-32x32.png ├── favicon-96x96.png ├── favicon.ico ├── manifest.json ├── ms-icon-144x144.png ├── ms-icon-150x150.png ├── ms-icon-310x310.png └── ms-icon-70x70.png ├── index.html └── js ├── arf.js └── d3.v3.min.js /.editorconfig: -------------------------------------------------------------------------------- 1 | # Space or Tabs? 2 | # https://stackoverflow.com/questions/35649847/objective-reasons-for-using-spaces-instead-of-tabs-for-indentation 3 | # https://stackoverflow.com/questions/12093748/how-to-use-tabs-instead-of-spaces-in-a-shell-script 4 | # https://github.com/editorconfig/editorconfig-defaults/blob/master/editorconfig-defaults.json 5 | # 6 | # 1. What happens when I press the Tab key in my text editor? 7 | # 2. What happens when I request my editor to indent one or more lines? 8 | # 3. What happens when I view a file containing U+0009 HORIZONTAL TAB characters? 9 | # 10 | # Answers: 11 | # 12 | # 1. Pressing the Tab key should indent the current line (or selected lines) one additional level. 13 | # 2. As a secondary alternative, I can also tolerate an editor that, 14 | # like Emacs, uses this key for a context-sensitive fix-my-indentation command. 15 | # 3. Indenting one or more lines should follow the reigning convention, if consensus is sufficiently strong; otherwise, 16 | # I greatly prefer 2-space indentation at each level. U+0009 characters should shift subsequent characters to the next tab stop. 17 | # 18 | # Note: VIM users should use alternate marks [[[ and ]]] as the original ones can confuse nested substitutions, e.g.: ${${${VAR}}} 19 | # 20 | # -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*- 21 | # vim: ft=zsh sw=2 ts=2 et 22 | 23 | root = true 24 | 25 | [*] 26 | charset = utf-8 27 | indent_style = space 28 | indent_size = 2 29 | insert_final_newline = true 30 | trim_trailing_whitespace = true 31 | 32 | [*.sln] 33 | indent_style = tab 34 | 35 | [*.{md,mdx,rst}] 36 | trim_trailing_whitespace = false 37 | 38 | [*.{cmd,bat}] 39 | end_of_line = crlf 40 | 41 | [*za-*] 42 | end_of_line = lf 43 | 44 | [*.{sh,bash,zsh,fish}] 45 | end_of_line = lf 46 | 47 | [Makefile] 48 | indent_style = tab 49 | indent_size = 4 50 | 51 | [*.{py,rb}] 52 | indent_size = 4 53 | 54 | [*.{go,java,scala,groovy,kotlin}] 55 | indent_style = tab 56 | indent_size = 4 57 | 58 | [*.{cs,csx,cake,vb,vbx}] 59 | # Default Severity for all .NET Code Style rules below 60 | dotnet_analyzer_diagnostic.severity = warning 61 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: "npm" 4 | directory: "/" 5 | schedule: 6 | interval: "daily" 7 | - package-ecosystem: "github-actions" 8 | directory: ".github/workflows" 9 | schedule: 10 | interval: "daily" 11 | -------------------------------------------------------------------------------- /.github/lychee.toml: -------------------------------------------------------------------------------- 1 | # Verbose program output 2 | #verbose = "warn" 3 | 4 | # Don't show interactive progress bar while checking links. 5 | no_progress = true 6 | 7 | # Path to summary output file. 8 | #output = "report.md" 9 | 10 | ############################# Cache ############################### 11 | 12 | # Enable link caching. This can be helpful to avoid checking the same links on 13 | # multiple runs. 14 | cache = true 15 | 16 | # Discard all cached requests older than this duration. 17 | max_cache_age = "1d" 18 | 19 | ############################# Runtime ############################# 20 | 21 | # Number of threads to utilize. 22 | # Defaults to number of cores available to the system if omitted. 23 | #threads = 2 24 | 25 | # Maximum number of allowed redirects. 26 | #max_redirects = 10 27 | 28 | # Maximum number of allowed retries before a link is declared dead. 29 | #max_retries = 2 30 | 31 | # Maximum number of concurrent link checks. 32 | max_concurrency = 5 33 | 34 | ############################# Requests ############################ 35 | 36 | # User agent to send with each request. 37 | #user_agent = "curl/7.83. 1" 38 | 39 | # Website timeout from connect to response finished. 40 | #timeout = 20 41 | 42 | # Minimum wait time in seconds between retries of failed requests. 43 | #retry_wait_time = 2 44 | 45 | # Comma-separated list of accepted status codes for valid links. 46 | accept = [200, 429] 47 | 48 | # Proceed for server connections considered insecure (invalid TLS). 49 | insecure = false 50 | 51 | # Only test links with the given schemes (e.g. https). 52 | # Omit to check links with any scheme. 53 | scheme = ["https"] 54 | 55 | # When links are available using HTTPS, treat HTTP links as errors. 56 | require_https = true 57 | 58 | # Request method 59 | method = "get" 60 | 61 | # Custom request headers 62 | #headers = [] 63 | 64 | # Remap URI matching pattern to different URI. 65 | #remap = [ "https://example.com http://example.invalid" ] 66 | 67 | # Base URL or website root directory to check relative URLs. 68 | #base = "https://example.com" 69 | 70 | # HTTP basic auth support. This will be the username and password passed to the 71 | # authorization HTTP header. See 72 | # 73 | #basic_auth = "user:pwd" 74 | 75 | ############################# Exclusions ########################## 76 | 77 | # Skip missing input files (default is to error if they don't exist). 78 | skip_missing = true 79 | 80 | # Check links inside `` and `
` blocks as well as Markdown code
 81 | # blocks.
 82 | include_verbatim = true
 83 | 
 84 | # Ignore case of paths when matching glob patterns.
 85 | glob_ignore_case = true
 86 | 
 87 | # Exclude URLs and mail addresses from checking (supports regex).
 88 | exclude = [
 89 |   '.truepeoplesearch.com',
 90 |   'securitytrails.com',
 91 |   'globaledge.msu.edu',
 92 |   'www.mylife.com',
 93 |   'www.ussearch.com',
 94 |   'infospace.com',
 95 |   'archive.is',
 96 |   'biznar.com',
 97 |   'nuwber.com',
 98 |   'www.usphonebook.com',
 99 |   'insecam.org',
100 |   'web-beta.archive.',
101 |   '0day.today',
102 |   'www.dogpile.com',
103 |   'socialblade.com',
104 |   'www.vehiclehistory.com',
105 |   'search.wikileaks.org',
106 |   'www.blockchain.com/explorer',
107 |   'www.sciencedirect.com',
108 |   'twitter.com/search-advanced',
109 |   'www.politicalmoneyline.com',
110 |   'sandbox.pikker.ee',
111 |   'www.agoogleaday.com',
112 |   'sandbox.pikker.ee',
113 |   'www.proquest.com',
114 |   'dehashed.com',
115 |   'emailrep.io',
116 |   'imgur.com',
117 |   'www.bgp4.as',
118 |   '.onion',
119 |   '.*\.github.com\.*',
120 | ]
121 | 
122 | # Exclude these filesystem paths from getting checked.
123 | exclude_path = []
124 | 
125 | # URLs to check (supports regex). Has preference over all excludes.
126 | #include = [ 'gist\.github\.com.*' ]
127 | 
128 | # Exclude all private IPs from checking.
129 | # Equivalent to setting `exclude_private`, `exclude_link_local`, and
130 | # `exclude_loopback` to true.
131 | exclude_all_private = true
132 | 
133 | # Exclude private IP address ranges from checking.
134 | #exclude_private = false
135 | 
136 | # Exclude link-local IP address range from checking.
137 | #exclude_link_local = false
138 | 
139 | # Exclude loopback IP address range and localhost from checking.
140 | #exclude_loopback = false
141 | 
142 | # Exclude all mail addresses from checking.
143 | exclude_mail = true
144 | 


--------------------------------------------------------------------------------
/.github/renovate.json:
--------------------------------------------------------------------------------
1 | {
2 |   "$schema": "https://docs.renovatebot.com/renovate-schema.json",
3 |   "description": "Default preset: https://github.com/ss-o/renovate-config/blob/main/default.json",
4 |   "extends": ["github>ss-o/renovate-config"]
5 | }
6 | 


--------------------------------------------------------------------------------
/.github/workflows/cloudflare-pages.yml:
--------------------------------------------------------------------------------
 1 | ---
 2 | name: "🛳  Deploy"
 3 | on:
 4 |   push:
 5 |     branches: [main]
 6 |   workflow_dispatch: {}
 7 | 
 8 | permissions:
 9 |   contents: read
10 |   deployments: write
11 | 
12 | concurrency:
13 |   group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
14 |   cancel-in-progress: true
15 | 
16 | jobs:
17 |   deploy:
18 |     name: 🛳  Deploying
19 |     timeout-minutes: 30
20 |     runs-on: ubuntu-latest
21 |     if: github.ref == 'refs/heads/main'
22 |     steps:
23 |       - name: "⤵️  Check out code from GitHub"
24 |         uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
25 |         with:
26 |           fetch-depth: 0
27 |       - name: "📦 Setup pnpm"
28 |         uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
29 |       - name: "⎔  Setup node"
30 |         uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
31 |         with:
32 |           node-version: "lts/*"
33 |           cache: "pnpm"
34 |       - name: "🏗  Prepare"
35 |         run: pnpm install --prod
36 |       - name: "🚀 Publish"
37 |         uses: cloudflare/pages-action@f0a1cd58cd66095dee69bfa18fa5efd1dde93bca # v1.5.0
38 |         with:
39 |           projectName: "osint-framework"
40 |           directory: "public"
41 |           apiToken: ${{ secrets.CF_PAGES_API_TOKEN }}
42 |           accountId: ${{ secrets.CF_ACCOUNT_ID }}
43 |           gitHubToken: ${{ secrets.GITHUB_TOKEN }}
44 | 


--------------------------------------------------------------------------------
/.github/workflows/lychee.yml:
--------------------------------------------------------------------------------
 1 | ---
 2 | name: "✅ Lychee"
 3 | 
 4 | on:
 5 |   repository_dispatch:
 6 |   workflow_dispatch:
 7 |   workflow_call:
 8 |   schedule:
 9 |     - cron: "00 18 * * *"
10 |   push:
11 |     branches: [main]
12 |     paths:
13 |       - "public/**"
14 | 
15 | concurrency:
16 |   group: ${{ github.workflow }}-${{ github.ref }}
17 |   cancel-in-progress: true
18 | 
19 | jobs:
20 |   check-links:
21 |     runs-on: ubuntu-latest
22 |     steps:
23 |       - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
24 |       - name: "📤 Restore cache"
25 |         uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4
26 |         with:
27 |           path: .lycheecache
28 |           key: cache-lychee-${{ github.sha }}
29 |           restore-keys: cache-lychee-
30 | 
31 |       - name: "📊 Lychee Link Checker"
32 |         id: lychee
33 |         uses: lycheeverse/lychee-action@82202e5e9c2f4ef1a55a3d02563e1cb6041e5332
34 |         with:
35 |           args: --config $CONFIG_FILE --base . --verbose --no-progress './public/arf.json'
36 |           format: markdown
37 |           output: ./docs/LINKS_REPORT.md
38 |           fail: false
39 |           jobSummary: true
40 |         env:
41 |           GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
42 |           CONFIG_FILE: ${{ github.workspace }}/.github/lychee.toml
43 | 
44 |       - name: "🔖 Create Issue From File"
45 |         if: env.lychee_exit_code != 0
46 |         uses: peter-evans/create-issue-from-file@e8ef132d6df98ed982188e460ebb3b5d4ef3a9cd # v5
47 |         with:
48 |           title: Link Checker Report
49 |           content-filepath: ./docs/LINKS_REPORT.md
50 |           issue-number: 49
51 |           labels: report, automated issue
52 | 


--------------------------------------------------------------------------------
/.github/workflows/trunk-check.yml:
--------------------------------------------------------------------------------
 1 | ---
 2 | name: ⭕ Trunk [check]
 3 | on:
 4 |   push:
 5 |     branches: [main]
 6 |     tags: [v*.*.*]
 7 |   pull_request:
 8 |     types: [opened, synchronize]
 9 |   workflow_dispatch: {}
10 | 
11 | concurrency:
12 |   group: ${{ github.head_ref || github.run_id }}
13 |   cancel-in-progress: true
14 | 
15 | jobs:
16 |   check:
17 |     runs-on: ubuntu-latest
18 |     permissions:
19 |       checks: write # For trunk to post annotations
20 |       contents: read # For repo checkout
21 |     steps:
22 |       - name: ✅ Checkout
23 |         uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
24 |       - name: ✨ Trunk Check
25 |         uses: trunk-io/trunk-action@75699af9e26881e564e9d832ef7dc3af25ec031b # v1
26 | 


--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
 1 | # vendor packages #
 2 | ######################
 3 | package-lock.json
 4 | public/js/vendor
 5 | node_modules
 6 | .yarn/*
 7 | !.yarn/cache
 8 | !.yarn/patches
 9 | !.yarn/plugins
10 | !.yarn/releases
11 | !.yarn/sdks
12 | !.yarn/versions
13 | 
14 | # OS generated files #
15 | ######################
16 | .DS_Store
17 | .DS_Store?
18 | ._*
19 | .Spotlight-V100
20 | .Trashes
21 | ehthumbs.db
22 | Thumbs.db
23 | 


--------------------------------------------------------------------------------
/.trunk/.gitignore:
--------------------------------------------------------------------------------
 1 | *out
 2 | *logs
 3 | *actions
 4 | *notifications
 5 | *tools
 6 | plugins
 7 | user_trunk.yaml
 8 | user.yaml
 9 | tmp
10 | 


--------------------------------------------------------------------------------
/.trunk/configs/.markdownlint.yaml:
--------------------------------------------------------------------------------
 1 | # Autoformatter friendly markdownlint config (all formatting rules disabled)
 2 | default: true
 3 | blank_lines: false
 4 | bullet: false
 5 | html: false
 6 | indentation: false
 7 | line_length: false
 8 | spaces: false
 9 | url: false
10 | whitespace: false
11 | 


--------------------------------------------------------------------------------
/.trunk/configs/.yamllint.yaml:
--------------------------------------------------------------------------------
 1 | rules:
 2 |   quoted-strings:
 3 |     required: only-when-needed
 4 |     extra-allowed: ["{|}"]
 5 |   empty-values:
 6 |     forbid-in-block-mappings: true
 7 |     forbid-in-flow-mappings: true
 8 |   key-duplicates: {}
 9 |   octal-values:
10 |     forbid-implicit-octal: true
11 | 


--------------------------------------------------------------------------------
/.trunk/trunk.yaml:
--------------------------------------------------------------------------------
 1 | version: 0.1
 2 | cli:
 3 |   version: 1.22.11
 4 | plugins:
 5 |   sources:
 6 |     - id: trunk
 7 |       ref: v1.6.7
 8 |       uri: https://github.com/trunk-io/plugins
 9 | lint:
10 |   disabled:
11 |     - renovate
12 |     - yamllint
13 |   ignore:
14 |     - linters: [prettier]
15 |       paths:
16 |         - "public/css/**"
17 |   enabled:
18 |     - checkov@3.2.390
19 |     - osv-scanner@2.0.0
20 |     - trufflehog@3.88.18
21 |     - actionlint@1.7.7
22 |     - git-diff-check
23 |     - gitleaks@8.24.0
24 |     - markdownlint@0.44.0
25 |     - oxipng@9.1.4
26 |     - prettier@3.5.3
27 |     - taplo@0.9.3
28 | runtimes:
29 |   enabled:
30 |     - go@1.21.0
31 |     - node@18.20.5
32 |     - python@3.10.8
33 | actions:
34 |   enabled:
35 |     - trunk-announce
36 |     - trunk-check-pre-push
37 |     - trunk-fmt-pre-commit
38 |     - trunk-upgrade-available
39 | 


--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 |   "json.maxItemsComputed": 25000,
3 |   "cSpell.ignoreWords": ["midgrey", "rier", "wicoop"],
4 |   "cSpell.enableFiletypes": ["source.css.styled", "toml"],
5 |   "cSpell.words": ["darkmode"]
6 | }
7 | 


--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
 1 | MIT License
 2 | 
 3 | Copyright (c) 2017 Justin Nordine (https://github.com/s0lray)
 4 | 
 5 | Permission is hereby granted, free of charge, to any person obtaining a copy
 6 | of this software and associated documentation files (the "Software"), to deal
 7 | in the Software without restriction, including without limitation the rights
 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 | 
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 | 
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 | 


--------------------------------------------------------------------------------
/docs/README.md:
--------------------------------------------------------------------------------
 1 | # `OSINT Framework`
 2 | 
 3 | 
4 | osint-framework 5 |
6 |
7 |

8 | 9 | Lychee Check Links 10 | 11 | 12 | Deployment 13 | 14 |

15 | 16 | ```sh 17 | # We trust you have received the usual lecture from the local System 18 | # Administrator. It usually boils down to these three things: 19 | 20 | #1) Respect the privacy of others. 21 | #2) Think before you type. 22 | #3) With great power comes great responsibility. 23 | ``` 24 | 25 | ## Development 26 | 27 | - [Propose](https://github.com/digital-clouds/osint/issues/new) the resources 28 | - Links located at [/public/arf.json](/public/arf.json) 29 | - [autochecked URLs](https://github.com/digital-clouds/osint/issues/49) are broken/dead and need to be removed/adjusted/fixed. 30 | - verified/working URLs, but [ignored](https://github.com/digital-clouds/osint/blob/main/.lycheeignore) from checking, because of its specefic behaviour/response. 31 | - Dependencies: [git](https://github.com/git-guides/install-git), [pnpm](https://pnpm.io/installation) 32 | 33 | Clone and install: 34 | 35 | ```shell 36 | git clone https://github.com/digital-clouds/osint; cd osint 37 | pnpm i 38 | ``` 39 | 40 | Check or lint files: 41 | 42 | ```shell 43 | pnpm fmt 44 | pnpm check 45 | ``` 46 | 47 | > Run: `pnpm trunk -h` to see available options. 48 | 49 | Start server: 50 | 51 | ```shell 52 | pnpm dev 53 | ``` 54 | 55 | Visit http://0.0.0.0:8787 or use keys to select required option: 56 | 57 | - b `open a browser` 58 | - d `open Devtools` 59 | - l `turn on local mode` 60 | - c `clear console` 61 | - x `to exit` 62 | -------------------------------------------------------------------------------- /docs/images/osint-framework.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/digital-clouds/osint/7f99985640db7252e38ed4d5fa19e37402f4affd/docs/images/osint-framework.png -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "osint-framework", 3 | "version": "1.0.0", 4 | "description": "Open Source Intelligence - Reconnaissance Framework", 5 | "main": "public/index.html", 6 | "scripts": { 7 | "clean": "pnpm exec rm -rf node_modules build pnpm-lock.yaml", 8 | "postinstall": "copyfiles -f ./node_modules/d3/d3.min.js ./public/js/vendor/d3", 9 | "fmt": "trunk fmt", 10 | "dev": "wrangler dev --assets public/ --latest", 11 | "check": "trunk check" 12 | }, 13 | "dependencies": { 14 | "copyfiles": "2.4.1", 15 | "d3": "7.9.0" 16 | }, 17 | "packageManager": "pnpm@10.11.0" 18 | } 19 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | copyfiles: 12 | specifier: 2.4.1 13 | version: 2.4.1 14 | d3: 15 | specifier: 7.9.0 16 | version: 7.9.0 17 | 18 | packages: 19 | 20 | ansi-regex@5.0.1: 21 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 22 | engines: {node: '>=8'} 23 | 24 | ansi-styles@4.3.0: 25 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 26 | engines: {node: '>=8'} 27 | 28 | balanced-match@1.0.2: 29 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 30 | 31 | brace-expansion@1.1.11: 32 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 33 | 34 | cliui@7.0.4: 35 | resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} 36 | 37 | color-convert@2.0.1: 38 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 39 | engines: {node: '>=7.0.0'} 40 | 41 | color-name@1.1.4: 42 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 43 | 44 | commander@7.2.0: 45 | resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} 46 | engines: {node: '>= 10'} 47 | 48 | concat-map@0.0.1: 49 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 50 | 51 | copyfiles@2.4.1: 52 | resolution: {integrity: sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==} 53 | hasBin: true 54 | 55 | core-util-is@1.0.3: 56 | resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} 57 | 58 | d3-array@3.2.4: 59 | resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} 60 | engines: {node: '>=12'} 61 | 62 | d3-axis@3.0.0: 63 | resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==} 64 | engines: {node: '>=12'} 65 | 66 | d3-brush@3.0.0: 67 | resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==} 68 | engines: {node: '>=12'} 69 | 70 | d3-chord@3.0.1: 71 | resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==} 72 | engines: {node: '>=12'} 73 | 74 | d3-color@3.1.0: 75 | resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} 76 | engines: {node: '>=12'} 77 | 78 | d3-contour@4.0.2: 79 | resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==} 80 | engines: {node: '>=12'} 81 | 82 | d3-delaunay@6.0.4: 83 | resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==} 84 | engines: {node: '>=12'} 85 | 86 | d3-dispatch@3.0.1: 87 | resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} 88 | engines: {node: '>=12'} 89 | 90 | d3-drag@3.0.0: 91 | resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} 92 | engines: {node: '>=12'} 93 | 94 | d3-dsv@3.0.1: 95 | resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==} 96 | engines: {node: '>=12'} 97 | hasBin: true 98 | 99 | d3-ease@3.0.1: 100 | resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} 101 | engines: {node: '>=12'} 102 | 103 | d3-fetch@3.0.1: 104 | resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==} 105 | engines: {node: '>=12'} 106 | 107 | d3-force@3.0.0: 108 | resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} 109 | engines: {node: '>=12'} 110 | 111 | d3-format@3.1.0: 112 | resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} 113 | engines: {node: '>=12'} 114 | 115 | d3-geo@3.1.1: 116 | resolution: {integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==} 117 | engines: {node: '>=12'} 118 | 119 | d3-hierarchy@3.1.2: 120 | resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} 121 | engines: {node: '>=12'} 122 | 123 | d3-interpolate@3.0.1: 124 | resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} 125 | engines: {node: '>=12'} 126 | 127 | d3-path@3.1.0: 128 | resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} 129 | engines: {node: '>=12'} 130 | 131 | d3-polygon@3.0.1: 132 | resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==} 133 | engines: {node: '>=12'} 134 | 135 | d3-quadtree@3.0.1: 136 | resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} 137 | engines: {node: '>=12'} 138 | 139 | d3-random@3.0.1: 140 | resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==} 141 | engines: {node: '>=12'} 142 | 143 | d3-scale-chromatic@3.1.0: 144 | resolution: {integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==} 145 | engines: {node: '>=12'} 146 | 147 | d3-scale@4.0.2: 148 | resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} 149 | engines: {node: '>=12'} 150 | 151 | d3-selection@3.0.0: 152 | resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} 153 | engines: {node: '>=12'} 154 | 155 | d3-shape@3.2.0: 156 | resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} 157 | engines: {node: '>=12'} 158 | 159 | d3-time-format@4.1.0: 160 | resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} 161 | engines: {node: '>=12'} 162 | 163 | d3-time@3.1.0: 164 | resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} 165 | engines: {node: '>=12'} 166 | 167 | d3-timer@3.0.1: 168 | resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} 169 | engines: {node: '>=12'} 170 | 171 | d3-transition@3.0.1: 172 | resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} 173 | engines: {node: '>=12'} 174 | peerDependencies: 175 | d3-selection: 2 - 3 176 | 177 | d3-zoom@3.0.0: 178 | resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} 179 | engines: {node: '>=12'} 180 | 181 | d3@7.9.0: 182 | resolution: {integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==} 183 | engines: {node: '>=12'} 184 | 185 | delaunator@5.0.1: 186 | resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} 187 | 188 | emoji-regex@8.0.0: 189 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 190 | 191 | escalade@3.2.0: 192 | resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} 193 | engines: {node: '>=6'} 194 | 195 | fs.realpath@1.0.0: 196 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 197 | 198 | get-caller-file@2.0.5: 199 | resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} 200 | engines: {node: 6.* || 8.* || >= 10.*} 201 | 202 | glob@7.2.3: 203 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 204 | deprecated: Glob versions prior to v9 are no longer supported 205 | 206 | iconv-lite@0.6.3: 207 | resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} 208 | engines: {node: '>=0.10.0'} 209 | 210 | inflight@1.0.6: 211 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 212 | deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. 213 | 214 | inherits@2.0.4: 215 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 216 | 217 | internmap@2.0.3: 218 | resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} 219 | engines: {node: '>=12'} 220 | 221 | is-fullwidth-code-point@3.0.0: 222 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 223 | engines: {node: '>=8'} 224 | 225 | isarray@0.0.1: 226 | resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} 227 | 228 | isarray@1.0.0: 229 | resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} 230 | 231 | minimatch@3.1.2: 232 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 233 | 234 | mkdirp@1.0.4: 235 | resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} 236 | engines: {node: '>=10'} 237 | hasBin: true 238 | 239 | noms@0.0.0: 240 | resolution: {integrity: sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow==} 241 | 242 | once@1.4.0: 243 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 244 | 245 | path-is-absolute@1.0.1: 246 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 247 | engines: {node: '>=0.10.0'} 248 | 249 | process-nextick-args@2.0.1: 250 | resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} 251 | 252 | readable-stream@1.0.34: 253 | resolution: {integrity: sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==} 254 | 255 | readable-stream@2.3.8: 256 | resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} 257 | 258 | require-directory@2.1.1: 259 | resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} 260 | engines: {node: '>=0.10.0'} 261 | 262 | robust-predicates@3.0.2: 263 | resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} 264 | 265 | rw@1.3.3: 266 | resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} 267 | 268 | safe-buffer@5.1.2: 269 | resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} 270 | 271 | safer-buffer@2.1.2: 272 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 273 | 274 | string-width@4.2.3: 275 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 276 | engines: {node: '>=8'} 277 | 278 | string_decoder@0.10.31: 279 | resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} 280 | 281 | string_decoder@1.1.1: 282 | resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} 283 | 284 | strip-ansi@6.0.1: 285 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 286 | engines: {node: '>=8'} 287 | 288 | through2@2.0.5: 289 | resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} 290 | 291 | untildify@4.0.0: 292 | resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} 293 | engines: {node: '>=8'} 294 | 295 | util-deprecate@1.0.2: 296 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 297 | 298 | wrap-ansi@7.0.0: 299 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 300 | engines: {node: '>=10'} 301 | 302 | wrappy@1.0.2: 303 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 304 | 305 | xtend@4.0.2: 306 | resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} 307 | engines: {node: '>=0.4'} 308 | 309 | y18n@5.0.8: 310 | resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} 311 | engines: {node: '>=10'} 312 | 313 | yargs-parser@20.2.9: 314 | resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} 315 | engines: {node: '>=10'} 316 | 317 | yargs@16.2.0: 318 | resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} 319 | engines: {node: '>=10'} 320 | 321 | snapshots: 322 | 323 | ansi-regex@5.0.1: {} 324 | 325 | ansi-styles@4.3.0: 326 | dependencies: 327 | color-convert: 2.0.1 328 | 329 | balanced-match@1.0.2: {} 330 | 331 | brace-expansion@1.1.11: 332 | dependencies: 333 | balanced-match: 1.0.2 334 | concat-map: 0.0.1 335 | 336 | cliui@7.0.4: 337 | dependencies: 338 | string-width: 4.2.3 339 | strip-ansi: 6.0.1 340 | wrap-ansi: 7.0.0 341 | 342 | color-convert@2.0.1: 343 | dependencies: 344 | color-name: 1.1.4 345 | 346 | color-name@1.1.4: {} 347 | 348 | commander@7.2.0: {} 349 | 350 | concat-map@0.0.1: {} 351 | 352 | copyfiles@2.4.1: 353 | dependencies: 354 | glob: 7.2.3 355 | minimatch: 3.1.2 356 | mkdirp: 1.0.4 357 | noms: 0.0.0 358 | through2: 2.0.5 359 | untildify: 4.0.0 360 | yargs: 16.2.0 361 | 362 | core-util-is@1.0.3: {} 363 | 364 | d3-array@3.2.4: 365 | dependencies: 366 | internmap: 2.0.3 367 | 368 | d3-axis@3.0.0: {} 369 | 370 | d3-brush@3.0.0: 371 | dependencies: 372 | d3-dispatch: 3.0.1 373 | d3-drag: 3.0.0 374 | d3-interpolate: 3.0.1 375 | d3-selection: 3.0.0 376 | d3-transition: 3.0.1(d3-selection@3.0.0) 377 | 378 | d3-chord@3.0.1: 379 | dependencies: 380 | d3-path: 3.1.0 381 | 382 | d3-color@3.1.0: {} 383 | 384 | d3-contour@4.0.2: 385 | dependencies: 386 | d3-array: 3.2.4 387 | 388 | d3-delaunay@6.0.4: 389 | dependencies: 390 | delaunator: 5.0.1 391 | 392 | d3-dispatch@3.0.1: {} 393 | 394 | d3-drag@3.0.0: 395 | dependencies: 396 | d3-dispatch: 3.0.1 397 | d3-selection: 3.0.0 398 | 399 | d3-dsv@3.0.1: 400 | dependencies: 401 | commander: 7.2.0 402 | iconv-lite: 0.6.3 403 | rw: 1.3.3 404 | 405 | d3-ease@3.0.1: {} 406 | 407 | d3-fetch@3.0.1: 408 | dependencies: 409 | d3-dsv: 3.0.1 410 | 411 | d3-force@3.0.0: 412 | dependencies: 413 | d3-dispatch: 3.0.1 414 | d3-quadtree: 3.0.1 415 | d3-timer: 3.0.1 416 | 417 | d3-format@3.1.0: {} 418 | 419 | d3-geo@3.1.1: 420 | dependencies: 421 | d3-array: 3.2.4 422 | 423 | d3-hierarchy@3.1.2: {} 424 | 425 | d3-interpolate@3.0.1: 426 | dependencies: 427 | d3-color: 3.1.0 428 | 429 | d3-path@3.1.0: {} 430 | 431 | d3-polygon@3.0.1: {} 432 | 433 | d3-quadtree@3.0.1: {} 434 | 435 | d3-random@3.0.1: {} 436 | 437 | d3-scale-chromatic@3.1.0: 438 | dependencies: 439 | d3-color: 3.1.0 440 | d3-interpolate: 3.0.1 441 | 442 | d3-scale@4.0.2: 443 | dependencies: 444 | d3-array: 3.2.4 445 | d3-format: 3.1.0 446 | d3-interpolate: 3.0.1 447 | d3-time: 3.1.0 448 | d3-time-format: 4.1.0 449 | 450 | d3-selection@3.0.0: {} 451 | 452 | d3-shape@3.2.0: 453 | dependencies: 454 | d3-path: 3.1.0 455 | 456 | d3-time-format@4.1.0: 457 | dependencies: 458 | d3-time: 3.1.0 459 | 460 | d3-time@3.1.0: 461 | dependencies: 462 | d3-array: 3.2.4 463 | 464 | d3-timer@3.0.1: {} 465 | 466 | d3-transition@3.0.1(d3-selection@3.0.0): 467 | dependencies: 468 | d3-color: 3.1.0 469 | d3-dispatch: 3.0.1 470 | d3-ease: 3.0.1 471 | d3-interpolate: 3.0.1 472 | d3-selection: 3.0.0 473 | d3-timer: 3.0.1 474 | 475 | d3-zoom@3.0.0: 476 | dependencies: 477 | d3-dispatch: 3.0.1 478 | d3-drag: 3.0.0 479 | d3-interpolate: 3.0.1 480 | d3-selection: 3.0.0 481 | d3-transition: 3.0.1(d3-selection@3.0.0) 482 | 483 | d3@7.9.0: 484 | dependencies: 485 | d3-array: 3.2.4 486 | d3-axis: 3.0.0 487 | d3-brush: 3.0.0 488 | d3-chord: 3.0.1 489 | d3-color: 3.1.0 490 | d3-contour: 4.0.2 491 | d3-delaunay: 6.0.4 492 | d3-dispatch: 3.0.1 493 | d3-drag: 3.0.0 494 | d3-dsv: 3.0.1 495 | d3-ease: 3.0.1 496 | d3-fetch: 3.0.1 497 | d3-force: 3.0.0 498 | d3-format: 3.1.0 499 | d3-geo: 3.1.1 500 | d3-hierarchy: 3.1.2 501 | d3-interpolate: 3.0.1 502 | d3-path: 3.1.0 503 | d3-polygon: 3.0.1 504 | d3-quadtree: 3.0.1 505 | d3-random: 3.0.1 506 | d3-scale: 4.0.2 507 | d3-scale-chromatic: 3.1.0 508 | d3-selection: 3.0.0 509 | d3-shape: 3.2.0 510 | d3-time: 3.1.0 511 | d3-time-format: 4.1.0 512 | d3-timer: 3.0.1 513 | d3-transition: 3.0.1(d3-selection@3.0.0) 514 | d3-zoom: 3.0.0 515 | 516 | delaunator@5.0.1: 517 | dependencies: 518 | robust-predicates: 3.0.2 519 | 520 | emoji-regex@8.0.0: {} 521 | 522 | escalade@3.2.0: {} 523 | 524 | fs.realpath@1.0.0: {} 525 | 526 | get-caller-file@2.0.5: {} 527 | 528 | glob@7.2.3: 529 | dependencies: 530 | fs.realpath: 1.0.0 531 | inflight: 1.0.6 532 | inherits: 2.0.4 533 | minimatch: 3.1.2 534 | once: 1.4.0 535 | path-is-absolute: 1.0.1 536 | 537 | iconv-lite@0.6.3: 538 | dependencies: 539 | safer-buffer: 2.1.2 540 | 541 | inflight@1.0.6: 542 | dependencies: 543 | once: 1.4.0 544 | wrappy: 1.0.2 545 | 546 | inherits@2.0.4: {} 547 | 548 | internmap@2.0.3: {} 549 | 550 | is-fullwidth-code-point@3.0.0: {} 551 | 552 | isarray@0.0.1: {} 553 | 554 | isarray@1.0.0: {} 555 | 556 | minimatch@3.1.2: 557 | dependencies: 558 | brace-expansion: 1.1.11 559 | 560 | mkdirp@1.0.4: {} 561 | 562 | noms@0.0.0: 563 | dependencies: 564 | inherits: 2.0.4 565 | readable-stream: 1.0.34 566 | 567 | once@1.4.0: 568 | dependencies: 569 | wrappy: 1.0.2 570 | 571 | path-is-absolute@1.0.1: {} 572 | 573 | process-nextick-args@2.0.1: {} 574 | 575 | readable-stream@1.0.34: 576 | dependencies: 577 | core-util-is: 1.0.3 578 | inherits: 2.0.4 579 | isarray: 0.0.1 580 | string_decoder: 0.10.31 581 | 582 | readable-stream@2.3.8: 583 | dependencies: 584 | core-util-is: 1.0.3 585 | inherits: 2.0.4 586 | isarray: 1.0.0 587 | process-nextick-args: 2.0.1 588 | safe-buffer: 5.1.2 589 | string_decoder: 1.1.1 590 | util-deprecate: 1.0.2 591 | 592 | require-directory@2.1.1: {} 593 | 594 | robust-predicates@3.0.2: {} 595 | 596 | rw@1.3.3: {} 597 | 598 | safe-buffer@5.1.2: {} 599 | 600 | safer-buffer@2.1.2: {} 601 | 602 | string-width@4.2.3: 603 | dependencies: 604 | emoji-regex: 8.0.0 605 | is-fullwidth-code-point: 3.0.0 606 | strip-ansi: 6.0.1 607 | 608 | string_decoder@0.10.31: {} 609 | 610 | string_decoder@1.1.1: 611 | dependencies: 612 | safe-buffer: 5.1.2 613 | 614 | strip-ansi@6.0.1: 615 | dependencies: 616 | ansi-regex: 5.0.1 617 | 618 | through2@2.0.5: 619 | dependencies: 620 | readable-stream: 2.3.8 621 | xtend: 4.0.2 622 | 623 | untildify@4.0.0: {} 624 | 625 | util-deprecate@1.0.2: {} 626 | 627 | wrap-ansi@7.0.0: 628 | dependencies: 629 | ansi-styles: 4.3.0 630 | string-width: 4.2.3 631 | strip-ansi: 6.0.1 632 | 633 | wrappy@1.0.2: {} 634 | 635 | xtend@4.0.2: {} 636 | 637 | y18n@5.0.8: {} 638 | 639 | yargs-parser@20.2.9: {} 640 | 641 | yargs@16.2.0: 642 | dependencies: 643 | cliui: 7.0.4 644 | escalade: 3.2.0 645 | get-caller-file: 2.0.5 646 | require-directory: 2.1.1 647 | string-width: 4.2.3 648 | y18n: 5.0.8 649 | yargs-parser: 20.2.9 650 | -------------------------------------------------------------------------------- /public/css/arf.css: -------------------------------------------------------------------------------- 1 | @import url('https://cdn.jsdelivr.net/gh/ss-o/fonts@main/Hack/v3.003/web/hack.css'); 2 | @import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono&display=swap'); 3 | 4 | :root { 5 | --font-sans-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", 6 | "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", 7 | sans-serif; 8 | --font-serif: Georgia, Times, serif; 9 | --font-mono: 'JetBrains Mono', Hack, monospace; 10 | --color-green: #66db23; 11 | --color-yellow: #ffc822; 12 | --color-red: #df401c; 13 | --color-darkgrey: #15171a; 14 | --color-midgrey: #505050; 15 | --color-darkmode: #151719; 16 | --color-lightgrey: #c6cccf; 17 | --color-wash: #e5eff5; 18 | } 19 | 20 | html { 21 | font-family: 'JetBrains Mono', monospace; 22 | font-weight: 400; 23 | } 24 | 25 | body { 26 | font-family: Hack, monospace; 27 | color: lime; 28 | background-color: var(--color-darkmode); 29 | text-rendering: optimizeLegibility; 30 | -webkit-font-smoothing: antialiased; 31 | -moz-osx-font-smoothing: grayscale; 32 | } 33 | 34 | #body { 35 | margin: 0 auto; 36 | position: relative; 37 | } 38 | 39 | .legend { 40 | font-size: 10px; 41 | line-height: 0.8; 42 | font-weight: bold; 43 | color: lime; 44 | position: relative; 45 | } 46 | 47 | .footer { 48 | font-size: 10px; 49 | font-weight: bold; 50 | position: relative; 51 | } 52 | 53 | .node { 54 | cursor: pointer; 55 | } 56 | 57 | .node circle { 58 | cursor: pointer; 59 | fill: rgb(0, 255, 0); 60 | stroke: lime; 61 | stroke-width: 1.5px; 62 | } 63 | 64 | .node text { 65 | font-family: Hack, monospace; 66 | font-size: 12px; 67 | line-height: 0.8; 68 | fill: rgb(0, 255, 0); 69 | stroke: lime; 70 | } 71 | 72 | path.link { 73 | fill: none; 74 | stroke: var(--color-midgrey); 75 | stroke-width: 1px; 76 | } 77 | 78 | a:link { 79 | color: var(--color-yellow); 80 | } 81 | 82 | a:visited { 83 | color: var(--color-green); 84 | } 85 | 86 | a:hover { 87 | color: cyan; 88 | } 89 | 90 | #fa { 91 | color: var(--color-yellow); 92 | } 93 | 94 | .gh { 95 | color: gold; 96 | font-size: 12px; 97 | } 98 | -------------------------------------------------------------------------------- /public/favicon/android-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/digital-clouds/osint/7f99985640db7252e38ed4d5fa19e37402f4affd/public/favicon/android-icon-144x144.png -------------------------------------------------------------------------------- /public/favicon/android-icon-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/digital-clouds/osint/7f99985640db7252e38ed4d5fa19e37402f4affd/public/favicon/android-icon-192x192.png -------------------------------------------------------------------------------- /public/favicon/android-icon-36x36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/digital-clouds/osint/7f99985640db7252e38ed4d5fa19e37402f4affd/public/favicon/android-icon-36x36.png -------------------------------------------------------------------------------- /public/favicon/android-icon-48x48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/digital-clouds/osint/7f99985640db7252e38ed4d5fa19e37402f4affd/public/favicon/android-icon-48x48.png -------------------------------------------------------------------------------- /public/favicon/android-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/digital-clouds/osint/7f99985640db7252e38ed4d5fa19e37402f4affd/public/favicon/android-icon-72x72.png -------------------------------------------------------------------------------- /public/favicon/android-icon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/digital-clouds/osint/7f99985640db7252e38ed4d5fa19e37402f4affd/public/favicon/android-icon-96x96.png -------------------------------------------------------------------------------- /public/favicon/apple-icon-114x114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/digital-clouds/osint/7f99985640db7252e38ed4d5fa19e37402f4affd/public/favicon/apple-icon-114x114.png -------------------------------------------------------------------------------- /public/favicon/apple-icon-120x120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/digital-clouds/osint/7f99985640db7252e38ed4d5fa19e37402f4affd/public/favicon/apple-icon-120x120.png -------------------------------------------------------------------------------- /public/favicon/apple-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/digital-clouds/osint/7f99985640db7252e38ed4d5fa19e37402f4affd/public/favicon/apple-icon-144x144.png -------------------------------------------------------------------------------- /public/favicon/apple-icon-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/digital-clouds/osint/7f99985640db7252e38ed4d5fa19e37402f4affd/public/favicon/apple-icon-152x152.png -------------------------------------------------------------------------------- /public/favicon/apple-icon-180x180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/digital-clouds/osint/7f99985640db7252e38ed4d5fa19e37402f4affd/public/favicon/apple-icon-180x180.png -------------------------------------------------------------------------------- /public/favicon/apple-icon-57x57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/digital-clouds/osint/7f99985640db7252e38ed4d5fa19e37402f4affd/public/favicon/apple-icon-57x57.png -------------------------------------------------------------------------------- /public/favicon/apple-icon-60x60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/digital-clouds/osint/7f99985640db7252e38ed4d5fa19e37402f4affd/public/favicon/apple-icon-60x60.png -------------------------------------------------------------------------------- /public/favicon/apple-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/digital-clouds/osint/7f99985640db7252e38ed4d5fa19e37402f4affd/public/favicon/apple-icon-72x72.png -------------------------------------------------------------------------------- /public/favicon/apple-icon-76x76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/digital-clouds/osint/7f99985640db7252e38ed4d5fa19e37402f4affd/public/favicon/apple-icon-76x76.png -------------------------------------------------------------------------------- /public/favicon/apple-icon-precomposed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/digital-clouds/osint/7f99985640db7252e38ed4d5fa19e37402f4affd/public/favicon/apple-icon-precomposed.png -------------------------------------------------------------------------------- /public/favicon/apple-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/digital-clouds/osint/7f99985640db7252e38ed4d5fa19e37402f4affd/public/favicon/apple-icon.png -------------------------------------------------------------------------------- /public/favicon/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | #ffffff 3 | -------------------------------------------------------------------------------- /public/favicon/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/digital-clouds/osint/7f99985640db7252e38ed4d5fa19e37402f4affd/public/favicon/favicon-16x16.png -------------------------------------------------------------------------------- /public/favicon/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/digital-clouds/osint/7f99985640db7252e38ed4d5fa19e37402f4affd/public/favicon/favicon-32x32.png -------------------------------------------------------------------------------- /public/favicon/favicon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/digital-clouds/osint/7f99985640db7252e38ed4d5fa19e37402f4affd/public/favicon/favicon-96x96.png -------------------------------------------------------------------------------- /public/favicon/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/digital-clouds/osint/7f99985640db7252e38ed4d5fa19e37402f4affd/public/favicon/favicon.ico -------------------------------------------------------------------------------- /public/favicon/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "App", 3 | "icons": [ 4 | { 5 | "src": "/android-icon-36x36.png", 6 | "sizes": "36x36", 7 | "type": "image/png", 8 | "density": "0.75" 9 | }, 10 | { 11 | "src": "/android-icon-48x48.png", 12 | "sizes": "48x48", 13 | "type": "image/png", 14 | "density": "1.0" 15 | }, 16 | { 17 | "src": "/android-icon-72x72.png", 18 | "sizes": "72x72", 19 | "type": "image/png", 20 | "density": "1.5" 21 | }, 22 | { 23 | "src": "/android-icon-96x96.png", 24 | "sizes": "96x96", 25 | "type": "image/png", 26 | "density": "2.0" 27 | }, 28 | { 29 | "src": "/android-icon-144x144.png", 30 | "sizes": "144x144", 31 | "type": "image/png", 32 | "density": "3.0" 33 | }, 34 | { 35 | "src": "/android-icon-192x192.png", 36 | "sizes": "192x192", 37 | "type": "image/png", 38 | "density": "4.0" 39 | } 40 | ] 41 | } 42 | -------------------------------------------------------------------------------- /public/favicon/ms-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/digital-clouds/osint/7f99985640db7252e38ed4d5fa19e37402f4affd/public/favicon/ms-icon-144x144.png -------------------------------------------------------------------------------- /public/favicon/ms-icon-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/digital-clouds/osint/7f99985640db7252e38ed4d5fa19e37402f4affd/public/favicon/ms-icon-150x150.png -------------------------------------------------------------------------------- /public/favicon/ms-icon-310x310.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/digital-clouds/osint/7f99985640db7252e38ed4d5fa19e37402f4affd/public/favicon/ms-icon-310x310.png -------------------------------------------------------------------------------- /public/favicon/ms-icon-70x70.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/digital-clouds/osint/7f99985640db7252e38ed4d5fa19e37402f4affd/public/favicon/ms-icon-70x70.png -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | 14 | OSINT Framework 15 | 16 | 17 | 18 |
19 | 20 |
21 |
22 | 23 | 24 | 25 | 34 | 35 | 36 | 37 | 40 | 41 | 42 | 43 | 47 | 48 | 49 | 50 | 54 | 55 |
(D) 26 |   Google Dork, for more 27 | information: 28 | Google Hacking 33 |
(R) 38 |   Requires registration 39 |
(M) 44 |   Provides URL with a 45 | search query 46 |
(T) 51 |   The tool has to be set 52 | up on a local device 53 |
56 |
57 | 62 | 63 | 64 | -------------------------------------------------------------------------------- /public/js/arf.js: -------------------------------------------------------------------------------- 1 | var margin = [20, 120, 20, 140], 2 | width = 1280 - margin[1] - margin[3], 3 | height = 800 - margin[0] - margin[2], 4 | i = 0, 5 | duration = 1250, 6 | root; 7 | 8 | var tree = d3.layout.tree().size([height, width]); 9 | 10 | var diagonal = d3.svg.diagonal().projection(function (d) { 11 | return [d.y, d.x]; 12 | }); 13 | 14 | var vis = d3 15 | .select("#body") 16 | .append("svg:svg") 17 | .attr("width", width + margin[1] + margin[3]) 18 | .attr("height", height + margin[0] + margin[2]) 19 | .append("svg:g") 20 | .attr("transform", "translate(" + margin[3] + "," + margin[0] + ")"); 21 | 22 | d3.json("arf.json", function (json) { 23 | root = json; 24 | root.x0 = height / 2; 25 | root.y0 = 0; 26 | 27 | function collapse(d) { 28 | if (d.children) { 29 | d._children = d.children; 30 | d._children.forEach(collapse); 31 | d.children = null; 32 | } 33 | } 34 | 35 | /* function toggleAll(d) { 36 | if (d.children) { 37 | d.children.forEach(toggleAll); 38 | toggle(d); 39 | } 40 | } */ 41 | root.children.forEach(collapse); 42 | update(root); 43 | }); 44 | 45 | function update(source) { 46 | // var duration = d3.event && d3.event.altKey ? 5000 : 500; 47 | 48 | // Compute the new tree layout. 49 | var nodes = tree.nodes(root).reverse(); 50 | 51 | // Normalize for fixed-depth. 52 | nodes.forEach(function (d) { 53 | d.y = d.depth * 180; 54 | }); 55 | 56 | // Update the nodes… 57 | var node = vis.selectAll("g.node").data(nodes, function (d) { 58 | return d.id || (d.id = ++i); 59 | }); 60 | 61 | // Enter any new nodes at the parent's previous position. 62 | var nodeEnter = node 63 | .enter() 64 | .append("svg:g") 65 | .attr("class", "node") 66 | .attr("transform", function (d) { 67 | return "translate(" + source.y0 + "," + source.x0 + ")"; 68 | }) 69 | .on("click", function (d) { 70 | toggle(d); 71 | update(d); 72 | }); 73 | 74 | nodeEnter 75 | .append("svg:circle") 76 | .attr("r", 1e-6) 77 | .style("fill", function (d) { 78 | return d._children ? "black" : "#ffc822"; 79 | }); 80 | 81 | nodeEnter 82 | .append("a") 83 | .attr("target", "_blank") 84 | .attr("xlink:href", function (d) { 85 | return d.url; 86 | }) 87 | .append("svg:text") 88 | .attr("x", function (d) { 89 | return d.children || d._children ? -10 : 10; 90 | }) 91 | .attr("dy", ".35em") 92 | .attr("text-anchor", function (d) { 93 | return d.children || d._children ? "end" : "start"; 94 | }) 95 | .text(function (d) { 96 | return d.name; 97 | }) 98 | .style("fill: rgb(0, 0, 0)", function (d) { 99 | return d.free ? "black" : "#999"; 100 | }) 101 | .style("fill-opacity", 1e-6); 102 | 103 | nodeEnter.append("svg:title").text(function (d) { 104 | return d.description; 105 | }); 106 | 107 | // Transition nodes to their new position. 108 | var nodeUpdate = node 109 | .transition() 110 | .duration(duration) 111 | .attr("transform", function (d) { 112 | return "translate(" + d.y + "," + d.x + ")"; 113 | }); 114 | 115 | nodeUpdate 116 | .select("circle") 117 | .attr("r", 6) 118 | .style("fill", function (d) { 119 | return d._children ? "black" : "#ffc822"; 120 | }); 121 | 122 | nodeUpdate.select("text").style("fill-opacity", 1); 123 | 124 | // Transition exiting nodes to the parent's new position. 125 | var nodeExit = node 126 | .exit() 127 | .transition() 128 | .duration(duration) 129 | .attr("transform", function (d) { 130 | return "translate(" + source.y + "," + source.x + ")"; 131 | }) 132 | .remove(); 133 | 134 | nodeExit.select("circle").attr("r", 1e-6); 135 | 136 | nodeExit.select("text").style("fill-opacity", 1e-6); 137 | 138 | // Update the links… 139 | var link = vis.selectAll("path.link").data(tree.links(nodes), function (d) { 140 | return d.target.id; 141 | }); 142 | 143 | // Enter any new links at the parent's previous position. 144 | link 145 | .enter() 146 | .insert("svg:path", "g") 147 | .attr("class", "link") 148 | .attr("d", function (d) { 149 | var o = { x: source.x0, y: source.y0 }; 150 | return diagonal({ source: o, target: o }); 151 | }) 152 | .transition() 153 | .duration(duration) 154 | .attr("d", diagonal); 155 | 156 | // Transition links to their new position. 157 | link.transition().duration(duration).attr("d", diagonal); 158 | 159 | // Transition exiting nodes to the parent's new position. 160 | link 161 | .exit() 162 | .transition() 163 | .duration(duration) 164 | .attr("d", function (d) { 165 | var o = { x: source.x, y: source.y }; 166 | return diagonal({ source: o, target: o }); 167 | }) 168 | .remove(); 169 | 170 | // Stash the old positions for transition. 171 | nodes.forEach(function (d) { 172 | d.x0 = d.x; 173 | d.y0 = d.y; 174 | }); 175 | } 176 | 177 | // Toggle children. 178 | function toggle(d) { 179 | if (d.children) { 180 | d._children = d.children; 181 | d.children = null; 182 | } else { 183 | d.children = d._children; 184 | d._children = null; 185 | } 186 | } 187 | --------------------------------------------------------------------------------